From 25314fd2aed81aa5281bc3d93dbcc7919368ebe1 Mon Sep 17 00:00:00 2001 From: Bicker Date: Wed, 22 May 2019 17:45:37 +0200 Subject: Initial commit --- ql/ast/visitors/expression_evaluator.py | 37 +++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 ql/ast/visitors/expression_evaluator.py (limited to 'ql/ast/visitors/expression_evaluator.py') 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 -- cgit v1.2.3