diff options
| author | mryouse | 2022-05-10 02:07:40 +0000 |
|---|---|---|
| committer | mryouse | 2022-05-10 02:07:40 +0000 |
| commit | 7bed8de9b493ca2a2b13d6293db6bd81b73325ce (patch) | |
| tree | 7efa56cddb8a0cec4b4c03495874474b510c6a09 /parser.py | |
initial commit
Diffstat (limited to 'parser.py')
| -rw-r--r-- | parser.py | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/parser.py b/parser.py new file mode 100644 index 0000000..6360b62 --- /dev/null +++ b/parser.py @@ -0,0 +1,43 @@ +from tokens import * + + +def peek(inp): + if len(inp) == 0: + return None + return inp[0] + +def parse_expression(tkns): + # expressions MUST start with a symbol (for now?) + symbol = None + args = [] + for idx, t in enumerate(tkns): + #if isinstance(t, NebOpen): + 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 + args.append(t) + + raise Exception("couldn't parse expression!") + +def parse(tkns, parsed): + nxt = peek(tkns) + if nxt is None: + return parsed + if isinstance(nxt, NebOpen): + expr, remainder = parse_expression(tkns[1:]) + parsed.append(expr) + return parse(remainder, parsed) + elif isinstance(nxt, NebLiteral): + parsed.append(nxt) + return parse(tkns[1:], parsed) + elif isinstance(nxt, NebSymbol): + parsed.append(nxt) + return parse(tkns[1:], parsed) + else: + raise Exception("expecting an expression or a literal") + |
