diff options
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) |
