Introduce ExpressionEvaluator
This commit is contained in:
@@ -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!!
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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!! }
|
||||
|
||||
@@ -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!!
|
||||
|
||||
@@ -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!! }
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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!!
|
||||
|
||||
|
||||
@@ -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!!
|
||||
|
||||
@@ -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!!
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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!!
|
||||
|
||||
Reference in New Issue
Block a user