Enable variable assignment
This commit is contained in:
@@ -1,15 +1,29 @@
|
|||||||
from smnp.error.runtime import RuntimeException
|
from smnp.runtime.evaluator import Evaluator
|
||||||
from smnp.runtime.evaluator import evaluate
|
from smnp.runtime.evaluators.expression import expressionEvaluator
|
||||||
from smnp.type.model import Type
|
|
||||||
|
|
||||||
|
|
||||||
def evaluateAssignment(assignment, environment):
|
class AssignmentEvaluator(Evaluator):
|
||||||
target = assignment.target.identifier
|
|
||||||
value = evaluate(assignment.value, environment)
|
@classmethod
|
||||||
if value.type == Type.VOID:
|
def evaluator(cls, node, environment):
|
||||||
raise RuntimeException(f"Expected expression, found '{value.type.name}'", assignment.value.pos)
|
target = node.target.value
|
||||||
scopeOfExistingVariable = environment.findVariableScope(target)
|
value = expressionEvaluator(doAssert=True)(node.value, environment).value #TODO check if it isn't necessary to verify 'result' attr of EvaluatioNResult
|
||||||
if scopeOfExistingVariable is not None:
|
scopeOfExistingVariable = environment.findVariableScope(target)
|
||||||
scopeOfExistingVariable[target] = value
|
if scopeOfExistingVariable is None:
|
||||||
else:
|
environment.scopes[-1][target] = value
|
||||||
environment.scopes[-1][target] = value
|
else:
|
||||||
|
scopeOfExistingVariable[target] = value
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
#
|
||||||
|
# def evaluateAssignment(assignment, environment):
|
||||||
|
# target = assignment.target.identifier
|
||||||
|
# value = evaluate(assignment.value, environment)
|
||||||
|
# if value.type == Type.VOID:
|
||||||
|
# raise RuntimeException(f"Expected expression, found '{value.type.name}'", assignment.value.pos)
|
||||||
|
# scopeOfExistingVariable = environment.findVariableScope(target)
|
||||||
|
# if scopeOfExistingVariable is not None:
|
||||||
|
# scopeOfExistingVariable[target] = value
|
||||||
|
# else:
|
||||||
|
# environment.scopes[-1][target] = value
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
from smnp.ast.node.access import AccessNode
|
from smnp.ast.node.access import AccessNode
|
||||||
|
from smnp.ast.node.assignment import AssignmentNode
|
||||||
from smnp.ast.node.identifier import IdentifierNode
|
from smnp.ast.node.identifier import IdentifierNode
|
||||||
from smnp.ast.node.integer import IntegerLiteralNode
|
from smnp.ast.node.integer import IntegerLiteralNode
|
||||||
from smnp.ast.node.invocation import FunctionCallNode
|
from smnp.ast.node.invocation import FunctionCallNode
|
||||||
@@ -20,6 +21,7 @@ def expressionEvaluator(doAssert=False):
|
|||||||
from smnp.runtime.evaluators.function import FunctionCallEvaluator
|
from smnp.runtime.evaluators.function import FunctionCallEvaluator
|
||||||
|
|
||||||
from smnp.runtime.evaluators.access import AccessEvaluator
|
from smnp.runtime.evaluators.access import AccessEvaluator
|
||||||
|
from smnp.runtime.evaluators.assignment import AssignmentEvaluator
|
||||||
result = Evaluator.oneOf(
|
result = Evaluator.oneOf(
|
||||||
Evaluator.forNodes(FunctionCallEvaluator.evaluate, FunctionCallNode),
|
Evaluator.forNodes(FunctionCallEvaluator.evaluate, FunctionCallNode),
|
||||||
Evaluator.forNodes(StringEvaluator.evaluate, StringLiteralNode),
|
Evaluator.forNodes(StringEvaluator.evaluate, StringLiteralNode),
|
||||||
@@ -27,7 +29,8 @@ def expressionEvaluator(doAssert=False):
|
|||||||
Evaluator.forNodes(NoteEvaluator.evaluate, NoteLiteralNode),
|
Evaluator.forNodes(NoteEvaluator.evaluate, NoteLiteralNode),
|
||||||
Evaluator.forNodes(IdentifierEvaluator.evaluate, IdentifierNode),
|
Evaluator.forNodes(IdentifierEvaluator.evaluate, IdentifierNode),
|
||||||
Evaluator.forNodes(ListEvaluator.evaluate, ListNode),
|
Evaluator.forNodes(ListEvaluator.evaluate, ListNode),
|
||||||
Evaluator.forNodes(AccessEvaluator.evaluate, AccessNode)
|
Evaluator.forNodes(AccessEvaluator.evaluate, AccessNode),
|
||||||
|
Evaluator.forNodes(AssignmentEvaluator.evaluate, AssignmentNode)
|
||||||
)(node, environment)
|
)(node, environment)
|
||||||
|
|
||||||
if doAssert and result.result and result.value.type == Type.VOID:
|
if doAssert and result.result and result.value.type == Type.VOID:
|
||||||
|
|||||||
Reference in New Issue
Block a user