diff --git a/app/src/main/kotlin/io/smnp/evaluation/evaluator/AssignmentOperatorEvaluator.kt b/app/src/main/kotlin/io/smnp/evaluation/evaluator/AssignmentOperatorEvaluator.kt new file mode 100644 index 0000000..8aee960 --- /dev/null +++ b/app/src/main/kotlin/io/smnp/evaluation/evaluator/AssignmentOperatorEvaluator.kt @@ -0,0 +1,23 @@ +package io.smnp.evaluation.evaluator + +import io.smnp.dsl.ast.model.node.AssignmentOperatorNode +import io.smnp.dsl.ast.model.node.IdentifierNode +import io.smnp.dsl.ast.model.node.Node +import io.smnp.environment.Environment +import io.smnp.evaluation.model.entity.EvaluatorOutput + +class AssignmentOperatorEvaluator : Evaluator() { + private val evaluator = ExpressionEvaluator() + + override fun supportedNodes() = listOf(AssignmentOperatorNode::class) + + override fun tryToEvaluate(node: Node, environment: Environment): EvaluatorOutput { + val (identifierNode, _, valueNode) = node as AssignmentOperatorNode + val identifier = (identifierNode as IdentifierNode).token.rawValue + val value = evaluator.evaluate(valueNode, environment).value!! + + environment.setVariable(identifier, value) + + return EvaluatorOutput.value(value) + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/io/smnp/evaluation/evaluator/ExpressionEvaluator.kt b/app/src/main/kotlin/io/smnp/evaluation/evaluator/ExpressionEvaluator.kt index 2ae70c9..266713e 100644 --- a/app/src/main/kotlin/io/smnp/evaluation/evaluator/ExpressionEvaluator.kt +++ b/app/src/main/kotlin/io/smnp/evaluation/evaluator/ExpressionEvaluator.kt @@ -27,6 +27,7 @@ class ExpressionEvaluator : Evaluator() { AccessOperatorEvaluator(), LogicOperatorEvaluator(), RelationOperatorEvaluator(), + AssignmentOperatorEvaluator(), FunctionCallEvaluator() ).evaluate(node, environment)