From 94666aca79039b962066234d6770ccecd882d216 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Fri, 12 Jul 2019 19:21:42 +0200 Subject: [PATCH] Create evaluator for minus operator --- smnp/runtime/evaluators/expression.py | 5 ++++- smnp/runtime/evaluators/minus.py | 31 +++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 smnp/runtime/evaluators/minus.py diff --git a/smnp/runtime/evaluators/expression.py b/smnp/runtime/evaluators/expression.py index 117f804..e4935af 100644 --- a/smnp/runtime/evaluators/expression.py +++ b/smnp/runtime/evaluators/expression.py @@ -2,6 +2,7 @@ from smnp.ast.node.atom import StringLiteral, IntegerLiteral, NoteLiteral, BoolL from smnp.ast.node.identifier import FunctionCall from smnp.ast.node.list import List from smnp.ast.node.map import Map +from smnp.ast.node.unit import MinusOperator from smnp.error.runtime import RuntimeException from smnp.runtime.evaluator import Evaluator from smnp.type.model import Type @@ -18,6 +19,7 @@ def expressionEvaluator(doAssert=False): from smnp.runtime.evaluators.function import FunctionCallEvaluator from smnp.runtime.evaluators.atom import ListEvaluator from smnp.runtime.evaluators.atom import MapEvaluator + from smnp.runtime.evaluators.minus import MinusEvaluator result = Evaluator.oneOf( Evaluator.forNodes(FunctionCallEvaluator.evaluate, FunctionCall), Evaluator.forNodes(StringEvaluator.evaluate, StringLiteral), @@ -26,7 +28,8 @@ def expressionEvaluator(doAssert=False): Evaluator.forNodes(BoolEvaluator.evaluate, BoolLiteral), Evaluator.forNodes(TypeEvaluator.evaluate, TypeLiteral), Evaluator.forNodes(ListEvaluator.evaluate, List), - Evaluator.forNodes(MapEvaluator.evaluate, Map) + Evaluator.forNodes(MapEvaluator.evaluate, Map), + Evaluator.forNodes(MinusEvaluator.evaluate, MinusOperator) # Evaluator.forNodes(IdentifierEvaluator.evaluate, Identifier), # Evaluator.forNodes(ListEvaluator.evaluate, List), # Evaluator.forNodes(AccessEvaluator.evaluate, LeftAssociativeOperatorNode), diff --git a/smnp/runtime/evaluators/minus.py b/smnp/runtime/evaluators/minus.py new file mode 100644 index 0000000..5c20118 --- /dev/null +++ b/smnp/runtime/evaluators/minus.py @@ -0,0 +1,31 @@ +from smnp.error.runtime import RuntimeException +from smnp.runtime.evaluator import Evaluator, evaluate +from smnp.type.model import Type + + +class MinusEvaluator(Evaluator): + + @classmethod + def evaluator(cls, node, environment): + value = evaluate(node.value, environment).value + try: + return { + Type.INTEGER: cls.evaluateForInteger, + Type.STRING: cls.evaluateForString, + Type.LIST: cls.evaluateForList + }[value.type](value.value) + except KeyError: + raise RuntimeException(f"Type {value.type.name.lower()} does not support '{node.operator.value}' operator", node.pos) + + @classmethod + def evaluateForInteger(cls, value): + + return Type.integer(-value) + + @classmethod + def evaluateForString(cls, value): + return Type.string(value[::-1]) + + @classmethod + def evaluateForList(cls, value): + return Type.list(value[::-1]) \ No newline at end of file