aboutsummaryrefslogtreecommitdiff
path: root/parser.py
diff options
context:
space:
mode:
Diffstat (limited to 'parser.py')
-rw-r--r--parser.py42
1 files changed, 4 insertions, 38 deletions
diff --git a/parser.py b/parser.py
index 6acda5d..7916a97 100644
--- a/parser.py
+++ b/parser.py
@@ -27,47 +27,13 @@ class Expr:
def __str__(self):
return f"'{self.name}"
- class Nary:
- def __init__(self, symbol, args):
- self.symbol = symbol
+ class List:
+ def __init__(self, args):
self.args = args
def accept(self, visitor):
visitor.visitNary(self)
def __str__(self):
- out = f"[{self.symbol} => ("
- first = True
- for arg in self.args:
- if first:
- out = f"{out} {arg}"
- first = False
- else:
- out = f"{out}, {arg}"
- return f"{out} )]"
-
- class Binary:
- def __init__(self, symbol, left, right):
- self.symbol = symbol
- self.left = left
- self.right = right
- def accept(self, visitor):
- visitor.visitBinary(self)
-
-class Visitor:
- def visitLiteral(self, literal):
- return literal.value
- def visitBinary(self, binary):
- sym = binary.symbol.text
- left = binary.left.accept(self)
- right = binary.right.accept(self)
- return "({sym} {left} {right}"
- def visitNary(self, nary):
- sym = nary.symbol.text
- args = []
- for arg in nary.args:
- args.append(arg.accept(self))
- return "({sym} {' '.join(args)})"
- def visitSymbol(self, symbol):
- return symbol.name
+ return "(" + " ".join(f"{arg}" for arg in self.args) + ")"
def parseExpression(token, prev, tokens):
idx = 0
@@ -91,7 +57,7 @@ def parseExpression(token, prev, tokens):
idx += inc
prev = token
- return Expr.Nary(args[0], args[1:]), idx + 2 # parens
+ return Expr.List(args), idx + 2 # parens
def parseSymbol(token, prev, tokens):
return Expr.Symbol(token.text), 1