Create if-else statement evaluator
This commit is contained in:
35
smnp/runtime/evaluators/condition.py
Normal file
35
smnp/runtime/evaluators/condition.py
Normal file
@@ -0,0 +1,35 @@
|
||||
from smnp.error.runtime import RuntimeException
|
||||
from smnp.runtime.evaluator import Evaluator, evaluate
|
||||
from smnp.runtime.evaluators.expression import expressionEvaluator
|
||||
from smnp.type.model import Type
|
||||
|
||||
|
||||
class IfElseEvaluator(Evaluator):
|
||||
|
||||
@classmethod
|
||||
def evaluator(cls, node, environment):
|
||||
condition = expressionEvaluator(doAssert=True)(node.condition, environment).value
|
||||
|
||||
if condition.type != Type.BOOL:
|
||||
raise RuntimeException(f"Only {Type.BOOL.name.lower()} types can be used as conditions in conditional expression", node.condition.pos)
|
||||
|
||||
if condition.value:
|
||||
return expressionEvaluator(doAssert=True)(node.ifNode, environment).value
|
||||
else:
|
||||
return expressionEvaluator(doAssert=True)(node.elseNode, environment).value
|
||||
|
||||
|
||||
class IfElseStatementEvaluator(Evaluator):
|
||||
|
||||
@classmethod
|
||||
def evaluator(cls, node, environment):
|
||||
condition = expressionEvaluator(doAssert=True)(node.condition, environment).value
|
||||
|
||||
if condition.type != Type.BOOL:
|
||||
raise RuntimeException(
|
||||
f"Only {Type.BOOL.name.lower()} types can be used as conditions in conditional expression", node.condition.pos)
|
||||
|
||||
if condition.value:
|
||||
evaluate(node.ifNode, environment)
|
||||
else:
|
||||
evaluate(node.elseNode, environment)
|
||||
@@ -1,3 +1,4 @@
|
||||
from smnp.ast.node.condition import IfElse
|
||||
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
|
||||
@@ -22,6 +23,7 @@ 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
|
||||
result = Evaluator.oneOf(
|
||||
Evaluator.forNodes(FunctionCallEvaluator.evaluate, FunctionCall),
|
||||
Evaluator.forNodes(MinusEvaluator.evaluate, MinusOperator),
|
||||
@@ -33,6 +35,7 @@ def expressionEvaluator(doAssert=False):
|
||||
Evaluator.forNodes(ProductEvaluator.evaluate, Product),
|
||||
Evaluator.forNodes(SumEvaluator.evaluate, Sum),
|
||||
Evaluator.forNodes(RelationEvaluator.evaluate, Relation),
|
||||
Evaluator.forNodes(IfElseEvaluator.evaluate, IfElse),
|
||||
AtomEvaluator.evaluate
|
||||
)(node, environment)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user