From db5564306399f0a3af97eb13808140542aa5b42c Mon Sep 17 00:00:00 2001 From: mryouse Date: Tue, 10 May 2022 04:12:04 +0000 Subject: nested expressions! --- parser.py | 17 ++++++++++++----- runner.py | 6 ++++++ 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/parser.py b/parser.py index 6360b62..97717bf 100644 --- a/parser.py +++ b/parser.py @@ -7,19 +7,26 @@ def peek(inp): return inp[0] def parse_expression(tkns): - # expressions MUST start with a symbol (for now?) symbol = None args = [] + add_idx = 0 for idx, t in enumerate(tkns): - #if isinstance(t, NebOpen): + # if we evaluated a nested expression, skip ahead + if add_idx > 0: + add_idx -= 1 + continue if idx == 0: if not isinstance(t, NebSymbol): raise Exception("expressions must start with a symbol") else: symbol = t elif isinstance(t, NebClose): - return NebExpression(symbol, args), tkns[idx + 1:] - else: # TODO nested expressions + return NebExpression(symbol, args), tkns[idx + 1:], idx + 1 + # nested expressions + elif isinstance(t, NebOpen): + expr, remainder, add_idx = parse_expression(tkns[idx + 1:]) + args.append(expr) + else: args.append(t) raise Exception("couldn't parse expression!") @@ -29,7 +36,7 @@ def parse(tkns, parsed): if nxt is None: return parsed if isinstance(nxt, NebOpen): - expr, remainder = parse_expression(tkns[1:]) + expr, remainder, _ = parse_expression(tkns[1:]) parsed.append(expr) return parse(remainder, parsed) elif isinstance(nxt, NebLiteral): diff --git a/runner.py b/runner.py index 8e4f86d..0d8560e 100644 --- a/runner.py +++ b/runner.py @@ -23,6 +23,12 @@ def evaluate(items, pop): if not nxt.symbol.name in STD: raise Exception(f"no such symbol: {nxt.symbol.name}") this_func = STD[nxt.symbol.name] + + # evaluate inner expressions + for idx, arg in enumerate(nxt.args): + if isinstance(arg, NebExpression): + nxt.args[idx] = evaluate([arg], pop) + if nxt.maybe_sig() not in this_func: raise Exception(f"'{nxt.symbol.name}' called with unknown signature: '{nxt.maybe_sig()}'") ret = this_func[nxt.maybe_sig()].impl(*(nxt.args)) -- cgit v1.2.3