Create evaluator for minus operator

This commit is contained in:
Bartłomiej Pluta
2019-07-12 19:21:42 +02:00
parent 6d1351e4a0
commit 94666aca79
2 changed files with 35 additions and 1 deletions

View File

@@ -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),

View File

@@ -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])