From 7bed8de9b493ca2a2b13d6293db6bd81b73325ce Mon Sep 17 00:00:00 2001 From: mryouse Date: Tue, 10 May 2022 02:07:40 +0000 Subject: initial commit --- parser.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 parser.py (limited to 'parser.py') 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") + -- cgit v1.2.3