diff --git a/src/main/kotlin/io/smnp/evaluation/evaluator/DefaultEvaluator.kt b/src/main/kotlin/io/smnp/evaluation/evaluator/DefaultEvaluator.kt index 2860e2b..0d91fd6 100644 --- a/src/main/kotlin/io/smnp/evaluation/evaluator/DefaultEvaluator.kt +++ b/src/main/kotlin/io/smnp/evaluation/evaluator/DefaultEvaluator.kt @@ -22,7 +22,8 @@ class DefaultEvaluator : Evaluator() { PowerOperatorEvaluator(), ProductOperatorEvaluator(), SumOperatorEvaluator(), - AccessOperatorEvaluator() + AccessOperatorEvaluator(), + LogicOperatorEvaluator() ).evaluate(node, environment) } } \ No newline at end of file diff --git a/src/main/kotlin/io/smnp/evaluation/evaluator/LogicOperatorEvaluator.kt b/src/main/kotlin/io/smnp/evaluation/evaluator/LogicOperatorEvaluator.kt new file mode 100644 index 0000000..fdbab03 --- /dev/null +++ b/src/main/kotlin/io/smnp/evaluation/evaluator/LogicOperatorEvaluator.kt @@ -0,0 +1,38 @@ +package io.smnp.evaluation.evaluator + +import io.smnp.data.enumeration.DataType +import io.smnp.data.model.Value +import io.smnp.dsl.ast.model.node.LogicOperatorNode +import io.smnp.dsl.ast.model.node.Node +import io.smnp.dsl.ast.model.node.TokenNode +import io.smnp.dsl.token.model.enumeration.TokenType +import io.smnp.error.EvaluationException +import io.smnp.error.ShouldNeverReachThisLineException +import io.smnp.evaluation.environment.Environment +import io.smnp.evaluation.model.entity.EvaluatorOutput + +class LogicOperatorEvaluator : Evaluator() { + override fun supportedNodes() = listOf(LogicOperatorNode::class) + + override fun tryToEvaluate(node: Node, environment: Environment): EvaluatorOutput { + val evaluator = DefaultEvaluator() + val (lhsNode, opNode, rhsNode) = (node as LogicOperatorNode) + val lhs = evaluator.evaluate(lhsNode, environment).value!! + val rhs = evaluator.evaluate(rhsNode, environment).value!! + val operator = (opNode as TokenNode).token.type + + if(lhs.type != DataType.BOOL) { + throw EvaluationException("Operator '${operator.token}' supports only bool types", lhsNode.position) + } + + if(rhs.type != DataType.BOOL) { + throw EvaluationException("Operator '${operator.token}' supports only bool types", rhsNode.position) + } + + return EvaluatorOutput.value(when(operator) { + TokenType.AND -> Value.bool((lhs.value as Boolean) && (rhs.value as Boolean)) + TokenType.OR -> Value.bool((lhs.value as Boolean) || (rhs.value as Boolean)) + else -> throw ShouldNeverReachThisLineException() + }) + } +} \ No newline at end of file