aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--parser.py17
-rw-r--r--runner.py6
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))