From a28a98080dab918fcd5293e10a578b7808f25aba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Sat, 7 Mar 2020 18:13:17 +0100 Subject: [PATCH] Migrate sum operator evaluator to Kotlin --- .../evaluation/evaluator/DefaultEvaluator.kt | 3 +- .../evaluator/ProductOperatorEvaluator.kt | 2 +- .../evaluator/SumOperatorEvaluator.kt | 50 +++++++++++++++++++ 3 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 src/main/kotlin/io/smnp/evaluation/evaluator/SumOperatorEvaluator.kt diff --git a/src/main/kotlin/io/smnp/evaluation/evaluator/DefaultEvaluator.kt b/src/main/kotlin/io/smnp/evaluation/evaluator/DefaultEvaluator.kt index 389991c..cf45b78 100644 --- a/src/main/kotlin/io/smnp/evaluation/evaluator/DefaultEvaluator.kt +++ b/src/main/kotlin/io/smnp/evaluation/evaluator/DefaultEvaluator.kt @@ -20,7 +20,8 @@ class DefaultEvaluator : Evaluator() { MinusOperatorEvaluator(), NotOperatorEvaluator(), PowerOperatorEvaluator(), - ProductOperatorEvaluator() + ProductOperatorEvaluator(), + SumOperatorEvaluator() ).evaluate(node, environment) } } \ No newline at end of file diff --git a/src/main/kotlin/io/smnp/evaluation/evaluator/ProductOperatorEvaluator.kt b/src/main/kotlin/io/smnp/evaluation/evaluator/ProductOperatorEvaluator.kt index 7756f05..c8db2d1 100644 --- a/src/main/kotlin/io/smnp/evaluation/evaluator/ProductOperatorEvaluator.kt +++ b/src/main/kotlin/io/smnp/evaluation/evaluator/ProductOperatorEvaluator.kt @@ -22,7 +22,7 @@ class ProductOperatorEvaluator : Evaluator() { val operator = (opNode as TokenNode).token.type if (!lhs.type.isNumeric() || !rhs.type.isNumeric()) { - throw EvaluationException("Operator $operator supports only numeric types", node.position) + throw EvaluationException("Operator ${operator.token} supports only numeric types", node.position) } return EvaluatorOutput.value( diff --git a/src/main/kotlin/io/smnp/evaluation/evaluator/SumOperatorEvaluator.kt b/src/main/kotlin/io/smnp/evaluation/evaluator/SumOperatorEvaluator.kt new file mode 100644 index 0000000..5eec676 --- /dev/null +++ b/src/main/kotlin/io/smnp/evaluation/evaluator/SumOperatorEvaluator.kt @@ -0,0 +1,50 @@ +package io.smnp.evaluation.evaluator + +import io.smnp.data.enumeration.DataType +import io.smnp.data.model.Value +import io.smnp.dsl.ast.model.node.Node +import io.smnp.dsl.ast.model.node.SumOperatorNode +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 SumOperatorEvaluator : Evaluator() { + override fun supportedNodes() = listOf(SumOperatorNode::class) + + override fun tryToEvaluate(node: Node, environment: Environment): EvaluatorOutput { + val evaluator = DefaultEvaluator() + val (lhsNode, opNode, rhsNode) = (node as SumOperatorNode) + val lhs = evaluator.evaluate(lhsNode, environment).value!! + val rhs = evaluator.evaluate(rhsNode, environment).value!! + val operator = (opNode as TokenNode).token.type + + if(!lhs.type.isNumeric() || !rhs.type.isNumeric()) { + throw EvaluationException("Operator ${operator.token} supports only numeric types", node.position) + } + + return EvaluatorOutput.value(when(operator) { + TokenType.PLUS -> sum(lhs, rhs) + TokenType.MINUS -> difference(lhs, rhs) + else -> throw ShouldNeverReachThisLineException() + }) + } + + private fun sum(lhs: Value, rhs: Value): Value { + if(listOf(lhs.type, rhs.type).contains(DataType.FLOAT)) { + return Value.float((lhs.value as Number).toFloat() + (rhs.value as Number).toFloat()) + } + + return Value.int((lhs.value as Int) + (rhs.value as Int)) + } + + private fun difference(lhs: Value, rhs: Value): Value { + if(listOf(lhs.type, rhs.type).contains(DataType.FLOAT)) { + return Value.float((lhs.value as Number).toFloat() - (rhs.value as Number).toFloat()) + } + + return Value.int((lhs.value as Int) - (rhs.value as Int)) + } +} \ No newline at end of file