Compose DefaultEvaluator and RootEvaluator

This commit is contained in:
2020-03-07 14:03:10 +01:00
parent 6ef7d346ff
commit 26e5153cd3
6 changed files with 61 additions and 15 deletions

View File

@@ -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)
}

View File

@@ -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)
}
}

View File

@@ -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!! }

View File

@@ -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!! }

View File

@@ -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()
}
}

View File

@@ -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)