From 35eb38076ff4615a8c633f9fc7ac334c6981ebbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Fri, 12 Jul 2019 19:45:54 +0200 Subject: [PATCH] Create evaluator for not operator --- smnp/runtime/evaluators/expression.py | 3 +++ smnp/runtime/evaluators/negation.py | 16 ++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 smnp/runtime/evaluators/negation.py diff --git a/smnp/runtime/evaluators/expression.py b/smnp/runtime/evaluators/expression.py index 4d20707..8add597 100644 --- a/smnp/runtime/evaluators/expression.py +++ b/smnp/runtime/evaluators/expression.py @@ -1,3 +1,4 @@ +from smnp.ast.node.factor import NotOperator from smnp.ast.node.identifier import FunctionCall from smnp.ast.node.unit import MinusOperator, Access from smnp.error.runtime import RuntimeException @@ -12,10 +13,12 @@ def expressionEvaluator(doAssert=False): from smnp.runtime.evaluators.atom import AtomEvaluator from smnp.runtime.evaluators.access import AccessEvaluator + from smnp.runtime.evaluators.negation import NotEvaluator result = Evaluator.oneOf( Evaluator.forNodes(FunctionCallEvaluator.evaluate, FunctionCall), Evaluator.forNodes(MinusEvaluator.evaluate, MinusOperator), Evaluator.forNodes(AccessEvaluator.evaluate, Access), + Evaluator.forNodes(NotEvaluator.evaluate, NotOperator), AtomEvaluator.evaluate )(node, environment) diff --git a/smnp/runtime/evaluators/negation.py b/smnp/runtime/evaluators/negation.py new file mode 100644 index 0000000..4bb4c2e --- /dev/null +++ b/smnp/runtime/evaluators/negation.py @@ -0,0 +1,16 @@ +from smnp.error.runtime import RuntimeException +from smnp.runtime.evaluator import Evaluator +from smnp.runtime.evaluators.expression import expressionEvaluator +from smnp.type.model import Type + + +class NotEvaluator(Evaluator): + + @classmethod + def evaluator(cls, node, environment): + value = expressionEvaluator(doAssert=True)(node.value, environment).value + + if value.type != Type.BOOL: + raise RuntimeException(f"Operator '{node.operator.value}' is supported only by {Type.BOOL.name.lower()} type", node.pos) + + return Type.bool(not value.value) \ No newline at end of file