Migrate logic operators evaluator to Kotlin

This commit is contained in:
2020-03-07 19:23:33 +01:00
parent 81dfc32f67
commit 0bf2a98102
2 changed files with 40 additions and 1 deletions

View File

@@ -22,7 +22,8 @@ class DefaultEvaluator : Evaluator() {
PowerOperatorEvaluator(),
ProductOperatorEvaluator(),
SumOperatorEvaluator(),
AccessOperatorEvaluator()
AccessOperatorEvaluator(),
LogicOperatorEvaluator()
).evaluate(node, environment)
}
}

View File

@@ -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()
})
}
}