From 95e6a5f95d4e24688692a4af46fd483f9a7d40f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Fri, 12 Jul 2019 21:26:06 +0200 Subject: [PATCH] Create evaluator for relation operators --- smnp/audio/sound.py | 3 ++ smnp/runtime/evaluators/expression.py | 4 ++- smnp/runtime/evaluators/relation.py | 46 +++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 smnp/runtime/evaluators/relation.py diff --git a/smnp/audio/sound.py b/smnp/audio/sound.py index d46aadb..fed571e 100644 --- a/smnp/audio/sound.py +++ b/smnp/audio/sound.py @@ -10,6 +10,9 @@ class Sound: def play(self): sd.play(self.data, self.fs, blocking=True) + def __eq__(self, other): + return self.file == other.file and self.data == other.data + def __str__(self): return f"sound[{self.file}]" diff --git a/smnp/runtime/evaluators/expression.py b/smnp/runtime/evaluators/expression.py index 4259444..650ed46 100644 --- a/smnp/runtime/evaluators/expression.py +++ b/smnp/runtime/evaluators/expression.py @@ -1,4 +1,4 @@ -from smnp.ast.node.expression import Sum +from smnp.ast.node.expression import Sum, Relation from smnp.ast.node.factor import NotOperator, Power, Loop from smnp.ast.node.identifier import FunctionCall, Assignment from smnp.ast.node.term import Product @@ -21,6 +21,7 @@ def expressionEvaluator(doAssert=False): from smnp.runtime.evaluators.product import ProductEvaluator from smnp.runtime.evaluators.sum import SumEvaluator + from smnp.runtime.evaluators.relation import RelationEvaluator result = Evaluator.oneOf( Evaluator.forNodes(FunctionCallEvaluator.evaluate, FunctionCall), Evaluator.forNodes(MinusEvaluator.evaluate, MinusOperator), @@ -31,6 +32,7 @@ def expressionEvaluator(doAssert=False): Evaluator.forNodes(AssignmentEvaluator.evaluate, Assignment), Evaluator.forNodes(ProductEvaluator.evaluate, Product), Evaluator.forNodes(SumEvaluator.evaluate, Sum), + Evaluator.forNodes(RelationEvaluator.evaluate, Relation), AtomEvaluator.evaluate )(node, environment) diff --git a/smnp/runtime/evaluators/relation.py b/smnp/runtime/evaluators/relation.py new file mode 100644 index 0000000..0708d65 --- /dev/null +++ b/smnp/runtime/evaluators/relation.py @@ -0,0 +1,46 @@ +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 RelationEvaluator(Evaluator): + + @classmethod + def evaluator(cls, node, environment): + left = expressionEvaluator(doAssert=True)(node.left, environment).value + right = expressionEvaluator(doAssert=True)(node.right, environment).value + + if node.operator.value == "==": + return cls.equalOperatorEvaluator(left, node.operator, right) + + if node.operator.value == "!=": + return cls.notEqualOperatorEvaluator(left, node.operator, right) + + return cls.otherRelationOperatorsEvaluator(left, node.operator, right) + + @classmethod + def equalOperatorEvaluator(cls, left, operator, right): + return Type.bool(left.value == right.value) + + @classmethod + def notEqualOperatorEvaluator(cls, left, operator, right): + return Type.bool(left.value != right.value) + + @classmethod + def otherRelationOperatorsEvaluator(cls, left, operator, right): + if left.type == right.type == Type.INTEGER: + if operator.value == ">": + return Type.bool(left.value > right.value) + + if operator.value == ">=": + return Type.bool(left.value >= right.value) + + if operator.value == "<": + return Type.bool(left.value < right.value) + + if operator.value == "<=": + return Type.bool(left.value < right.value) + + raise RuntimeException(f"Operator {operator.value} is not supported by {left.type.name.lower()} and {right.type.name.lower()} types", operator.pos) +