aboutsummaryrefslogtreecommitdiff
path: root/parser.py
diff options
context:
space:
mode:
authormryouse2022-05-10 02:07:40 +0000
committermryouse2022-05-10 02:07:40 +0000
commit7bed8de9b493ca2a2b13d6293db6bd81b73325ce (patch)
tree7efa56cddb8a0cec4b4c03495874474b510c6a09 /parser.py
initial commit
Diffstat (limited to 'parser.py')
-rw-r--r--parser.py43
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")
+