diff options
| author | mryouse | 2022-05-13 02:35:25 +0000 |
|---|---|---|
| committer | mryouse | 2022-05-13 02:35:25 +0000 |
| commit | 3d23b45a0ab381f34a2dae327e22cfa862af46ea (patch) | |
| tree | 104bd1949d60947058b1208169b0372092b0f14c /parser.py | |
| parent | e18bdec21683adfb2658359568a54a2f3f21d703 (diff) | |
lists? not sure if they fully work, but somewhat
Diffstat (limited to 'parser.py')
| -rw-r--r-- | parser.py | 36 |
1 files changed, 36 insertions, 0 deletions
@@ -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) |
