From 78ea26ea0845e58ee64ae0bc430dcbcd0cbba0bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Sat, 13 Jul 2019 21:35:00 +0200 Subject: [PATCH] Add evaluators for logic operators 'and' and 'or' --- smnp/runtime/evaluators/expression.py | 6 +++++- smnp/runtime/evaluators/logic.py | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 smnp/runtime/evaluators/logic.py diff --git a/smnp/runtime/evaluators/expression.py b/smnp/runtime/evaluators/expression.py index d9ea964..e0758fa 100644 --- a/smnp/runtime/evaluators/expression.py +++ b/smnp/runtime/evaluators/expression.py @@ -1,5 +1,5 @@ from smnp.ast.node.condition import IfElse -from smnp.ast.node.expression import Sum, Relation +from smnp.ast.node.expression import Sum, Relation, And, Or from smnp.ast.node.factor import NotOperator, Power, Loop from smnp.ast.node.identifier import FunctionCall, Assignment from smnp.ast.node.term import Product @@ -24,6 +24,8 @@ def expressionEvaluator(doAssert=False): from smnp.runtime.evaluators.sum import SumEvaluator from smnp.runtime.evaluators.relation import RelationEvaluator from smnp.runtime.evaluators.condition import IfElseEvaluator + from smnp.runtime.evaluators.logic import AndEvaluator + from smnp.runtime.evaluators.logic import OrEvaluator result = Evaluator.oneOf( Evaluator.forNodes(FunctionCallEvaluator.evaluate, FunctionCall), Evaluator.forNodes(MinusEvaluator.evaluate, MinusOperator), @@ -36,6 +38,8 @@ def expressionEvaluator(doAssert=False): Evaluator.forNodes(SumEvaluator.evaluate, Sum), Evaluator.forNodes(RelationEvaluator.evaluate, Relation), Evaluator.forNodes(IfElseEvaluator.evaluate, IfElse), + Evaluator.forNodes(AndEvaluator.evaluate, And), + Evaluator.forNodes(OrEvaluator.evaluate, Or), AtomEvaluator.evaluate )(node, environment) diff --git a/smnp/runtime/evaluators/logic.py b/smnp/runtime/evaluators/logic.py new file mode 100644 index 0000000..da14c80 --- /dev/null +++ b/smnp/runtime/evaluators/logic.py @@ -0,0 +1,21 @@ +from smnp.runtime.evaluator import Evaluator +from smnp.runtime.evaluators.expression import expressionEvaluator +from smnp.type.model import Type + + +class AndEvaluator(Evaluator): + + @classmethod + def evaluator(cls, node, environment): + left = expressionEvaluator(doAssert=True)(node.left, environment).value + right = expressionEvaluator(doAssert=True)(node.right, environment).value + return Type.bool(left.value and right.value) + + +class OrEvaluator(Evaluator): + + @classmethod + def evaluator(cls, node, environment): + left = expressionEvaluator(doAssert=True)(node.left, environment).value + right = expressionEvaluator(doAssert=True)(node.right, environment).value + return Type.bool(left.value or right.value) \ No newline at end of file