Introduce ExpressionEvaluator

This commit is contained in:
2020-03-07 19:50:30 +01:00
parent c68d5efe62
commit c9e612a492
12 changed files with 48 additions and 26 deletions

View File

@@ -12,7 +12,7 @@ class AccessOperatorEvaluator : Evaluator() {
override fun supportedNodes() = listOf(AccessOperatorNode::class)
override fun tryToEvaluate(node: Node, environment: Environment): EvaluatorOutput {
val evaluator = DefaultEvaluator()
val evaluator = ExpressionEvaluator()
val (lhsNode, _, rhsNode) = (node as AccessOperatorNode)
val lhs = evaluator.evaluate(lhsNode, environment).value!!

View File

@@ -9,22 +9,7 @@ class DefaultEvaluator : Evaluator() {
override fun tryToEvaluate(node: Node, environment: Environment): EvaluatorOutput {
return oneOf(
IntegerLiteralEvaluator(),
FloatLiteralEvaluator(),
StringLiteralEvaluator(),
BoolLiteralEvaluator(),
NoteLiteralEvaluator(),
ListEvaluator(),
MapEvaluator(),
MinusOperatorEvaluator(),
NotOperatorEvaluator(),
PowerOperatorEvaluator(),
ProductOperatorEvaluator(),
SumOperatorEvaluator(),
AccessOperatorEvaluator(),
LogicOperatorEvaluator(),
RelationOperatorEvaluator()
ExpressionEvaluator()
).evaluate(node, environment)
}
}

View File

@@ -0,0 +1,37 @@
package io.smnp.evaluation.evaluator
import io.smnp.dsl.ast.model.node.Node
import io.smnp.evaluation.environment.Environment
import io.smnp.evaluation.model.entity.EvaluatorOutput
import io.smnp.evaluation.model.enumeration.EvaluationResult
class ExpressionEvaluator : Evaluator() {
override fun supportedNodes() = listOf(Node::class)
override fun tryToEvaluate(node: Node, environment: Environment): EvaluatorOutput {
val output = oneOf(
IntegerLiteralEvaluator(),
FloatLiteralEvaluator(),
StringLiteralEvaluator(),
BoolLiteralEvaluator(),
NoteLiteralEvaluator(),
ListEvaluator(),
MapEvaluator(),
MinusOperatorEvaluator(),
NotOperatorEvaluator(),
PowerOperatorEvaluator(),
ProductOperatorEvaluator(),
SumOperatorEvaluator(),
AccessOperatorEvaluator(),
LogicOperatorEvaluator(),
RelationOperatorEvaluator()
).evaluate(node, environment)
if(output.result == EvaluationResult.OK) {
throw RuntimeException("One evaluator of expression evaluator has returned a success output with no value, ${node.position}")
}
return output
}
}

View File

@@ -10,7 +10,7 @@ class ListEvaluator : Evaluator() {
override fun supportedNodes() = listOf(ListNode::class)
override fun tryToEvaluate(node: Node, environment: Environment): EvaluatorOutput {
val atomEvaluator = DefaultEvaluator()
val atomEvaluator = ExpressionEvaluator()
val items = (node as ListNode).items
.map { atomEvaluator.evaluate(it, environment) }
.map { it.value!! }

View File

@@ -15,7 +15,7 @@ class LogicOperatorEvaluator : Evaluator() {
override fun supportedNodes() = listOf(LogicOperatorNode::class)
override fun tryToEvaluate(node: Node, environment: Environment): EvaluatorOutput {
val evaluator = DefaultEvaluator()
val evaluator = ExpressionEvaluator()
val (lhsNode, opNode, rhsNode) = (node as LogicOperatorNode)
val lhs = evaluator.evaluate(lhsNode, environment).value!!
val rhs = evaluator.evaluate(rhsNode, environment).value!!

View File

@@ -11,7 +11,7 @@ class MapEvaluator : Evaluator() {
override fun supportedNodes() = listOf(MapNode::class)
override fun tryToEvaluate(node: Node, environment: Environment): EvaluatorOutput {
val atomEvaluator = DefaultEvaluator()
val atomEvaluator = ExpressionEvaluator()
val value = (node as MapNode).items
.map { it as MapEntryNode }
.map { atomEvaluator.evaluate(it.key, environment).value!! to atomEvaluator.evaluate(it.value, environment).value!! }

View File

@@ -12,7 +12,7 @@ class MinusOperatorEvaluator : Evaluator() {
override fun supportedNodes() = listOf(MinusOperatorNode::class)
override fun tryToEvaluate(node: Node, environment: Environment): EvaluatorOutput {
val evaluator = DefaultEvaluator()
val evaluator = ExpressionEvaluator()
val (_, operandNode) = (node as MinusOperatorNode)
val operand = evaluator.evaluate(operandNode, environment)

View File

@@ -13,7 +13,7 @@ class PowerOperatorEvaluator : Evaluator() {
override fun tryToEvaluate(node: Node, environment: Environment): EvaluatorOutput {
val (lhsNode, _, rhsNode) = (node as PowerOperatorNode)
val evaluator = DefaultEvaluator()
val evaluator = ExpressionEvaluator()
val lhs = evaluator.evaluate(lhsNode, environment).value!!
val rhs = evaluator.evaluate(rhsNode, environment).value!!

View File

@@ -15,7 +15,7 @@ class ProductOperatorEvaluator : Evaluator() {
override fun supportedNodes() = listOf(ProductOperatorNode::class)
override fun tryToEvaluate(node: Node, environment: Environment): EvaluatorOutput {
val evaluator = DefaultEvaluator()
val evaluator = ExpressionEvaluator()
val (lhsNode, opNode, rhsNode) = (node as ProductOperatorNode)
val lhs = evaluator.evaluate(lhsNode, environment).value!!
val rhs = evaluator.evaluate(rhsNode, environment).value!!

View File

@@ -14,7 +14,7 @@ class RelationOperatorEvaluator : Evaluator() {
override fun supportedNodes() = listOf(RelationOperatorNode::class)
override fun tryToEvaluate(node: Node, environment: Environment): EvaluatorOutput {
val evaluator = DefaultEvaluator()
val evaluator = ExpressionEvaluator()
val (lhsNode, opNode, rhsNode) = (node as RelationOperatorNode)
val lhs = evaluator.evaluate(lhsNode, environment).value!!
val rhs = evaluator.evaluate(rhsNode, environment).value!!

View File

@@ -10,7 +10,7 @@ class RootEvaluator : Evaluator() {
override fun supportedNodes() = listOf(RootNode::class)
override fun tryToEvaluate(node: Node, environment: Environment): EvaluatorOutput {
val evaluator = DefaultEvaluator()
val evaluator = ExpressionEvaluator()
for(child in node.children) {
val output = evaluator.evaluate(child, environment)
if(output.result == EvaluationResult.FAILED) {

View File

@@ -15,7 +15,7 @@ class SumOperatorEvaluator : Evaluator() {
override fun supportedNodes() = listOf(SumOperatorNode::class)
override fun tryToEvaluate(node: Node, environment: Environment): EvaluatorOutput {
val evaluator = DefaultEvaluator()
val evaluator = ExpressionEvaluator()
val (lhsNode, opNode, rhsNode) = (node as SumOperatorNode)
val lhs = evaluator.evaluate(lhsNode, environment).value!!
val rhs = evaluator.evaluate(rhsNode, environment).value!!