From 1a6986f3e8cf28fd854ae145f01240fad04b6e47 Mon Sep 17 00:00:00 2001 From: fishhhqi Date: Sun, 29 Dec 2024 11:23:32 +0800 Subject: [PATCH] Optimize parser by using an index Improved the read_from function to use an index for tracking the current position in the token list, which enhances the efficiency of the parser. --- tiddlylisp.py | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/tiddlylisp.py b/tiddlylisp.py index 61217ed..a9c40b8 100644 --- a/tiddlylisp.py +++ b/tiddlylisp.py @@ -112,19 +112,26 @@ def tokenize(s): def read_from(tokens): "Read an expression from a sequence of tokens." - if len(tokens) == 0: + N = len(tokens) + if N == 0: raise SyntaxError('unexpected EOF while reading') - token = tokens.pop(0) - if '(' == token: - L = [] - while tokens[0] != ')': - L.append(read_from(tokens)) - tokens.pop(0) # pop off ')' - return L - elif ')' == token: - raise SyntaxError('unexpected )') - else: - return atom(token) + + def read_val(idx): + match tokens[idx]: + case '(': + idx += 1 + L = [] + while tokens[idx] != ')': + idx, val = read_val(idx) + L.append(val) + return idx + 1, L + case ')': + raise SyntaxError('unexpected )') + case _: + return idx+1, atom(tokens[idx]) + + _, val = read_val(0) + return val def atom(token): "Numbers become numbers; every other token is a symbol."