diff --git a/src/main/kotlin/io/smnp/evaluation/evaluator/DefaultEvaluator.kt b/src/main/kotlin/io/smnp/evaluation/evaluator/DefaultEvaluator.kt index fce88f1..c908bc2 100644 --- a/src/main/kotlin/io/smnp/evaluation/evaluator/DefaultEvaluator.kt +++ b/src/main/kotlin/io/smnp/evaluation/evaluator/DefaultEvaluator.kt @@ -17,7 +17,8 @@ class DefaultEvaluator : Evaluator { forward(ListEvaluator(), ListNode::class), forward(MapEvaluator(), MapNode::class), - forward(MinusOperatorEvaluator(), MinusOperatorNode::class) + forward(MinusOperatorEvaluator(), MinusOperatorNode::class), + forward(NotOperatorEvaluator(), NotOperatorNode::class) ).evaluate(node, environment) } } \ No newline at end of file diff --git a/src/main/kotlin/io/smnp/evaluation/evaluator/Evaluator.kt b/src/main/kotlin/io/smnp/evaluation/evaluator/Evaluator.kt index 31d52db..72225eb 100644 --- a/src/main/kotlin/io/smnp/evaluation/evaluator/Evaluator.kt +++ b/src/main/kotlin/io/smnp/evaluation/evaluator/Evaluator.kt @@ -1,6 +1,7 @@ package io.smnp.evaluation.evaluator import io.smnp.dsl.ast.model.node.Node +import io.smnp.error.EvaluationException import io.smnp.evaluation.environment.Environment import io.smnp.evaluation.model.entity.EvaluatorOutput import io.smnp.evaluation.model.enumeration.EvaluationResult @@ -36,5 +37,19 @@ interface Evaluator { } } } + + fun assert(evaluator: Evaluator, expected: String): Evaluator { + return object : Evaluator { + override fun evaluate(node: Node, environment: Environment): EvaluatorOutput { + val output = evaluator.evaluate(node, environment) + + if(output.result == EvaluationResult.FAILED) { + throw EvaluationException("Expected $expected", node.position) + } + + return output + } + } + } } } \ No newline at end of file diff --git a/src/main/kotlin/io/smnp/evaluation/evaluator/NotOperatorEvaluator.kt b/src/main/kotlin/io/smnp/evaluation/evaluator/NotOperatorEvaluator.kt new file mode 100644 index 0000000..c5beb15 --- /dev/null +++ b/src/main/kotlin/io/smnp/evaluation/evaluator/NotOperatorEvaluator.kt @@ -0,0 +1,18 @@ +package io.smnp.evaluation.evaluator + +import io.smnp.data.model.Value +import io.smnp.dsl.ast.model.node.Node +import io.smnp.dsl.ast.model.node.NotOperatorNode +import io.smnp.evaluation.environment.Environment +import io.smnp.evaluation.evaluator.Evaluator.Companion.assert +import io.smnp.evaluation.model.entity.EvaluatorOutput + +class NotOperatorEvaluator : Evaluator { + override fun evaluate(node: Node, environment: Environment): EvaluatorOutput { + val evaluator = BoolLiteralEvaluator() + val (_, operandNode) = (node as NotOperatorNode) + val operand = assert(evaluator, "bool").evaluate(operandNode, environment) + + return EvaluatorOutput.value(Value.bool(!(operand.value!!.value as Boolean))) + } +} \ No newline at end of file