Compose DefaultEvaluator and RootEvaluator
This commit is contained in:
@@ -1,5 +1,21 @@
|
||||
package io.smnp
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
import io.smnp.dsl.ast.parser.RootParser
|
||||
import io.smnp.dsl.token.tokenizer.DefaultTokenizer
|
||||
import io.smnp.evaluation.environment.Environment
|
||||
import io.smnp.evaluation.evaluator.RootEvaluator
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
val code = "{ \"a\" -> [14, 15, 16], 4 -> @c }"
|
||||
val tokenizer = DefaultTokenizer()
|
||||
val parser = RootParser()
|
||||
val evaluator = RootEvaluator()
|
||||
|
||||
val lines = code.split("\n")
|
||||
val tokens = tokenizer.tokenize(lines)
|
||||
val ast = parser.parse(tokens)
|
||||
|
||||
val value = evaluator.evaluate(ast.node, Environment())
|
||||
|
||||
println(value)
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package io.smnp.evaluation.evaluator
|
||||
|
||||
import io.smnp.dsl.ast.model.node.*
|
||||
import io.smnp.evaluation.environment.Environment
|
||||
import io.smnp.evaluation.evaluator.Evaluator.Companion.forward
|
||||
import io.smnp.evaluation.evaluator.Evaluator.Companion.oneOf
|
||||
import io.smnp.evaluation.model.entity.EvaluatorOutput
|
||||
|
||||
class DefaultEvaluator : Evaluator {
|
||||
override fun evaluate(node: Node, environment: Environment): EvaluatorOutput {
|
||||
return oneOf(
|
||||
forward(IntegerLiteralEvaluator(), IntegerLiteralNode::class),
|
||||
forward(FloatLiteralEvaluator(), FloatLiteralNode::class),
|
||||
forward(StringLiteralEvaluator(), StringLiteralNode::class),
|
||||
forward(BoolLiteralEvaluator(), BoolLiteralNode::class),
|
||||
forward(NoteLiteralEvaluator(), NoteLiteralNode::class),
|
||||
forward(ListEvaluator(), ListNode::class),
|
||||
forward(MapEvaluator(), MapNode::class)
|
||||
).evaluate(node, environment)
|
||||
}
|
||||
}
|
||||
@@ -8,7 +8,7 @@ import io.smnp.evaluation.model.entity.EvaluatorOutput
|
||||
|
||||
class ListEvaluator : Evaluator {
|
||||
override fun evaluate(node: Node, environment: Environment): EvaluatorOutput {
|
||||
val atomEvaluator = RootEvaluator()
|
||||
val atomEvaluator = DefaultEvaluator()
|
||||
val items = (node as ListNode).items
|
||||
.map { atomEvaluator.evaluate(it, environment) }
|
||||
.map { it.value!! }
|
||||
|
||||
@@ -9,7 +9,7 @@ import io.smnp.evaluation.model.entity.EvaluatorOutput
|
||||
|
||||
class MapEvaluator : Evaluator {
|
||||
override fun evaluate(node: Node, environment: Environment): EvaluatorOutput {
|
||||
val atomEvaluator = RootEvaluator()
|
||||
val atomEvaluator = DefaultEvaluator()
|
||||
val value = (node as MapNode).items
|
||||
.map { it as MapEntryNode }
|
||||
.map { atomEvaluator.evaluate(it.key, environment).value!! to atomEvaluator.evaluate(it.value, environment).value!! }
|
||||
|
||||
@@ -1,21 +1,25 @@
|
||||
package io.smnp.evaluation.evaluator
|
||||
|
||||
import io.smnp.dsl.ast.model.node.*
|
||||
import io.smnp.dsl.ast.model.node.Node
|
||||
import io.smnp.dsl.ast.model.node.RootNode
|
||||
import io.smnp.evaluation.environment.Environment
|
||||
import io.smnp.evaluation.evaluator.Evaluator.Companion.forward
|
||||
import io.smnp.evaluation.evaluator.Evaluator.Companion.oneOf
|
||||
import io.smnp.evaluation.model.entity.EvaluatorOutput
|
||||
import io.smnp.evaluation.model.enumeration.EvaluationResult
|
||||
|
||||
class RootEvaluator : Evaluator {
|
||||
override fun evaluate(node: Node, environment: Environment): EvaluatorOutput {
|
||||
return oneOf(
|
||||
forward(IntegerLiteralEvaluator(), IntegerLiteralNode::class),
|
||||
forward(FloatLiteralEvaluator(), FloatLiteralNode::class),
|
||||
forward(StringLiteralEvaluator(), StringLiteralNode::class),
|
||||
forward(BoolLiteralEvaluator(), BoolLiteralNode::class),
|
||||
forward(NoteLiteralEvaluator(), NoteLiteralNode::class),
|
||||
forward(ListEvaluator(), ListNode::class),
|
||||
forward(MapEvaluator(), MapNode::class)
|
||||
).evaluate(node, environment)
|
||||
if(node !is RootNode) {
|
||||
return EvaluatorOutput.fail()
|
||||
}
|
||||
|
||||
val evaluator = DefaultEvaluator()
|
||||
for(child in node.children) {
|
||||
val output = evaluator.evaluate(child, environment)
|
||||
if(output.result == EvaluationResult.FAILED) {
|
||||
return EvaluatorOutput.fail()
|
||||
}
|
||||
}
|
||||
|
||||
return EvaluatorOutput.ok()
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,11 @@ import io.smnp.data.model.Value
|
||||
import io.smnp.evaluation.model.enumeration.EvaluationResult
|
||||
|
||||
class EvaluatorOutput private constructor(val result: EvaluationResult, val value: Value?) {
|
||||
|
||||
override fun toString(): String {
|
||||
return "${result.name.toLowerCase()}(${value ?: ""})"
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun ok(): EvaluatorOutput {
|
||||
return EvaluatorOutput(EvaluationResult.OK, null)
|
||||
|
||||
Reference in New Issue
Block a user