aboutsummaryrefslogtreecommitdiff
path: root/ql/ast/visitors/expression_evaluator.py
diff options
context:
space:
mode:
authorBicker <bickerkards@tuta.io>2019-05-22 17:45:37 +0200
committerBicker <bickerkards@tuta.io>2019-05-22 17:45:37 +0200
commit25314fd2aed81aa5281bc3d93dbcc7919368ebe1 (patch)
tree1995521ee652e419926de5fced0f2e3b655e70fb /ql/ast/visitors/expression_evaluator.py
Initial commitHEADmaster
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