Add evaluators for logic operators 'and' and 'or'
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
from smnp.ast.node.condition import IfElse
|
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.factor import NotOperator, Power, Loop
|
||||||
from smnp.ast.node.identifier import FunctionCall, Assignment
|
from smnp.ast.node.identifier import FunctionCall, Assignment
|
||||||
from smnp.ast.node.term import Product
|
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.sum import SumEvaluator
|
||||||
from smnp.runtime.evaluators.relation import RelationEvaluator
|
from smnp.runtime.evaluators.relation import RelationEvaluator
|
||||||
from smnp.runtime.evaluators.condition import IfElseEvaluator
|
from smnp.runtime.evaluators.condition import IfElseEvaluator
|
||||||
|
from smnp.runtime.evaluators.logic import AndEvaluator
|
||||||
|
from smnp.runtime.evaluators.logic import OrEvaluator
|
||||||
result = Evaluator.oneOf(
|
result = Evaluator.oneOf(
|
||||||
Evaluator.forNodes(FunctionCallEvaluator.evaluate, FunctionCall),
|
Evaluator.forNodes(FunctionCallEvaluator.evaluate, FunctionCall),
|
||||||
Evaluator.forNodes(MinusEvaluator.evaluate, MinusOperator),
|
Evaluator.forNodes(MinusEvaluator.evaluate, MinusOperator),
|
||||||
@@ -36,6 +38,8 @@ def expressionEvaluator(doAssert=False):
|
|||||||
Evaluator.forNodes(SumEvaluator.evaluate, Sum),
|
Evaluator.forNodes(SumEvaluator.evaluate, Sum),
|
||||||
Evaluator.forNodes(RelationEvaluator.evaluate, Relation),
|
Evaluator.forNodes(RelationEvaluator.evaluate, Relation),
|
||||||
Evaluator.forNodes(IfElseEvaluator.evaluate, IfElse),
|
Evaluator.forNodes(IfElseEvaluator.evaluate, IfElse),
|
||||||
|
Evaluator.forNodes(AndEvaluator.evaluate, And),
|
||||||
|
Evaluator.forNodes(OrEvaluator.evaluate, Or),
|
||||||
AtomEvaluator.evaluate
|
AtomEvaluator.evaluate
|
||||||
)(node, environment)
|
)(node, environment)
|
||||||
|
|
||||||
|
|||||||
21
smnp/runtime/evaluators/logic.py
Normal file
21
smnp/runtime/evaluators/logic.py
Normal 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)
|
||||||
Reference in New Issue
Block a user