Add evaluators for logic operators 'and' and 'or'

This commit is contained in:
Bartłomiej Pluta
2019-07-13 21:35:00 +02:00
parent b6983df2d3
commit 78ea26ea08
2 changed files with 26 additions and 1 deletions

View File

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

View File

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