Migrate logic operators evaluator to Kotlin
This commit is contained in:
@@ -22,7 +22,8 @@ class DefaultEvaluator : Evaluator() {
|
||||
PowerOperatorEvaluator(),
|
||||
ProductOperatorEvaluator(),
|
||||
SumOperatorEvaluator(),
|
||||
AccessOperatorEvaluator()
|
||||
AccessOperatorEvaluator(),
|
||||
LogicOperatorEvaluator()
|
||||
).evaluate(node, environment)
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user