diff --git a/src/main/kotlin/io/smnp/SMNP.kt b/src/main/kotlin/io/smnp/SMNP.kt index e81605c..50291ed 100644 --- a/src/main/kotlin/io/smnp/SMNP.kt +++ b/src/main/kotlin/io/smnp/SMNP.kt @@ -1,5 +1,21 @@ package io.smnp -fun main(args: Array) { +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) { + 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) } \ No newline at end of file diff --git a/src/main/kotlin/io/smnp/evaluation/evaluator/DefaultEvaluator.kt b/src/main/kotlin/io/smnp/evaluation/evaluator/DefaultEvaluator.kt new file mode 100644 index 0000000..61ff100 --- /dev/null +++ b/src/main/kotlin/io/smnp/evaluation/evaluator/DefaultEvaluator.kt @@ -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) + } +} \ No newline at end of file diff --git a/src/main/kotlin/io/smnp/evaluation/evaluator/ListEvaluator.kt b/src/main/kotlin/io/smnp/evaluation/evaluator/ListEvaluator.kt index 83228c6..d60d13c 100644 --- a/src/main/kotlin/io/smnp/evaluation/evaluator/ListEvaluator.kt +++ b/src/main/kotlin/io/smnp/evaluation/evaluator/ListEvaluator.kt @@ -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!! } diff --git a/src/main/kotlin/io/smnp/evaluation/evaluator/MapEvaluator.kt b/src/main/kotlin/io/smnp/evaluation/evaluator/MapEvaluator.kt index c0c102a..4ffe8ee 100644 --- a/src/main/kotlin/io/smnp/evaluation/evaluator/MapEvaluator.kt +++ b/src/main/kotlin/io/smnp/evaluation/evaluator/MapEvaluator.kt @@ -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!! } diff --git a/src/main/kotlin/io/smnp/evaluation/evaluator/RootEvaluator.kt b/src/main/kotlin/io/smnp/evaluation/evaluator/RootEvaluator.kt index 2a5dcac..69206aa 100644 --- a/src/main/kotlin/io/smnp/evaluation/evaluator/RootEvaluator.kt +++ b/src/main/kotlin/io/smnp/evaluation/evaluator/RootEvaluator.kt @@ -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() } } \ No newline at end of file diff --git a/src/main/kotlin/io/smnp/evaluation/model/entity/EvaluatorOutput.kt b/src/main/kotlin/io/smnp/evaluation/model/entity/EvaluatorOutput.kt index 8f0fd7b..fc8e1f4 100644 --- a/src/main/kotlin/io/smnp/evaluation/model/entity/EvaluatorOutput.kt +++ b/src/main/kotlin/io/smnp/evaluation/model/entity/EvaluatorOutput.kt @@ -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)