aboutsummaryrefslogtreecommitdiff
path: root/ql/ast/visitors/expression_evaluator.py
diff options
context:
space:
mode:
Diffstat (limited to 'ql/ast/visitors/expression_evaluator.py')
-rw-r--r--ql/ast/visitors/expression_evaluator.py37
1 files changed, 37 insertions, 0 deletions
diff --git a/ql/ast/visitors/expression_evaluator.py b/ql/ast/visitors/expression_evaluator.py
new file mode 100644
index 0000000..9306d98
--- /dev/null
+++ b/ql/ast/visitors/expression_evaluator.py
@@ -0,0 +1,37 @@
+from multimethods import multimethod
+
+from ql.ast.nodes.expressions.binary_operators.binary_operator import BinaryOperatorNode
+from ql.ast.nodes.expressions.literals.literal import LiteralNode
+from ql.ast.nodes.expressions.unary_operators.unary_operator import UnaryOperatorNode
+from ql.ast.nodes.expressions.variable import VariableNode
+from ql.types.undefined import QLUndefined
+
+
+class ExpressionEvaluator:
+ def __init__(self, form):
+ self.form = form
+ self.result = QLUndefined()
+
+ @multimethod(BinaryOperatorNode)
+ def visit(self, node):
+ node.left_expression.accept(self)
+ node.right_expression.accept(self)
+ node.evaluate()
+ self.result = node.value
+
+ @multimethod(UnaryOperatorNode)
+ def visit(self, node):
+ node.expression.accept(self)
+ node.evaluate()
+ self.result = node.value
+
+ @multimethod(LiteralNode)
+ def visit(self, node):
+ self.result = node.value
+
+ @multimethod(VariableNode)
+ def visit(self, node):
+ for question in self.form.block:
+ if node.identifier == question.identifier:
+ node.value = question.answer.value
+ self.result = node.value