aboutsummaryrefslogtreecommitdiff
path: root/parser.py
diff options
context:
space:
mode:
authormryouse2022-05-13 02:35:25 +0000
committermryouse2022-05-13 02:35:25 +0000
commit3d23b45a0ab381f34a2dae327e22cfa862af46ea (patch)
tree104bd1949d60947058b1208169b0372092b0f14c /parser.py
parente18bdec21683adfb2658359568a54a2f3f21d703 (diff)
lists? not sure if they fully work, but somewhat
Diffstat (limited to 'parser.py')
-rw-r--r--parser.py36
1 files changed, 36 insertions, 0 deletions
diff --git a/parser.py b/parser.py
index 97717bf..98a4712 100644
--- a/parser.py
+++ b/parser.py
@@ -12,6 +12,7 @@ def parse_expression(tkns):
add_idx = 0
for idx, t in enumerate(tkns):
# if we evaluated a nested expression, skip ahead
+ # TODO or list?
if add_idx > 0:
add_idx -= 1
continue
@@ -22,15 +23,46 @@ def parse_expression(tkns):
symbol = t
elif isinstance(t, NebClose):
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)
+
+ elif isinstance(t, NebListStart):
+ # TODO this might need to be add_idx + (return of parse_list)
+ lst, remainder, add_idx = parse_list(tkns[idx + 1:])
+ args.append(lst)
+
else:
args.append(t)
raise Exception("couldn't parse expression!")
+def parse_list(tkns):
+ items = []
+ add_idx = 0
+ for idx, t in enumerate(tkns):
+ if add_idx > 0:
+ add_idx -= 1
+ continue
+
+ if isinstance(t, NebListEnd):
+ return NebList(items), tkns[idx + 1:], idx + 1
+ elif isinstance(t, NebOpen):
+ expr, remainder, add_idx = parse_expression(tkns[1 + idx:])
+ items.append(expr)
+ elif isinstance(t, NebLiteral):
+ items.append(t)
+ elif isinstance(t, NebSymbol):
+ items.append(t)
+ elif isinstance(t, NebListStart):
+ # TODO: this probably means lists of lists don't work
+ lst, remainder, add_idx = parse_list(tkns[1:])
+ items.append(lst)
+
+ raise Exception("couldn't parse list!")
+
def parse(tkns, parsed):
nxt = peek(tkns)
if nxt is None:
@@ -39,6 +71,10 @@ def parse(tkns, parsed):
expr, remainder, _ = parse_expression(tkns[1:])
parsed.append(expr)
return parse(remainder, parsed)
+ elif isinstance(nxt, NebListStart):
+ lst, remainder, _ = parse_list(tkns[1:])
+ parsed.append(lst)
+ return parse(remainder, parsed)
elif isinstance(nxt, NebLiteral):
parsed.append(nxt)
return parse(tkns[1:], parsed)