From fff817b0fd27f6afcc9bead8cd56a4caffefa61c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Sat, 7 Mar 2020 13:43:36 +0100 Subject: [PATCH] Migrate literal evaluators to Kotlin --- .../ast/model/node/AbstractIterableNode.kt | 5 ++++- .../evaluator/BoolLiteralEvaluator.kt | 14 +++++++++++++ .../kotlin/evaluation/evaluator/Evaluator.kt | 5 +++-- .../evaluator/FloatLiteralEvaluator.kt | 14 +++++++++++++ .../evaluator/IntegerLiteralEvaluator.kt | 14 +++++++++++++ .../evaluation/evaluator/ListEvaluator.kt | 17 +++++++++++++++ .../evaluation/evaluator/MapEvaluator.kt | 20 ++++++++++++++++++ .../evaluator/NoteLiteralEvaluator.kt | 15 +++++++++++++ .../evaluation/evaluator/RootEvaluator.kt | 21 +++++++++++++++++++ .../evaluator/StringLiteralEvaluator.kt | 14 +++++++++++++ 10 files changed, 136 insertions(+), 3 deletions(-) create mode 100644 src/main/kotlin/evaluation/evaluator/BoolLiteralEvaluator.kt create mode 100644 src/main/kotlin/evaluation/evaluator/FloatLiteralEvaluator.kt create mode 100644 src/main/kotlin/evaluation/evaluator/IntegerLiteralEvaluator.kt create mode 100644 src/main/kotlin/evaluation/evaluator/ListEvaluator.kt create mode 100644 src/main/kotlin/evaluation/evaluator/MapEvaluator.kt create mode 100644 src/main/kotlin/evaluation/evaluator/NoteLiteralEvaluator.kt create mode 100644 src/main/kotlin/evaluation/evaluator/RootEvaluator.kt create mode 100644 src/main/kotlin/evaluation/evaluator/StringLiteralEvaluator.kt diff --git a/src/main/kotlin/dsl/ast/model/node/AbstractIterableNode.kt b/src/main/kotlin/dsl/ast/model/node/AbstractIterableNode.kt index d70fdcf..b2a917b 100644 --- a/src/main/kotlin/dsl/ast/model/node/AbstractIterableNode.kt +++ b/src/main/kotlin/dsl/ast/model/node/AbstractIterableNode.kt @@ -2,4 +2,7 @@ package dsl.ast.model.node import dsl.token.model.entity.TokenPosition -abstract class AbstractIterableNode(items: List, position: TokenPosition) : Node(items, position) \ No newline at end of file +abstract class AbstractIterableNode(items: List, position: TokenPosition) : Node(items, position) { + val items: List + get() = children +} \ No newline at end of file diff --git a/src/main/kotlin/evaluation/evaluator/BoolLiteralEvaluator.kt b/src/main/kotlin/evaluation/evaluator/BoolLiteralEvaluator.kt new file mode 100644 index 0000000..a7ad0ee --- /dev/null +++ b/src/main/kotlin/evaluation/evaluator/BoolLiteralEvaluator.kt @@ -0,0 +1,14 @@ +package evaluation.evaluator + +import data.model.Value +import dsl.ast.model.node.BoolLiteralNode +import dsl.ast.model.node.Node +import evaluation.environment.Environment +import evaluation.model.entity.EvaluatorOutput + +class BoolLiteralEvaluator : Evaluator { + override fun evaluate(node: Node, environment: Environment): EvaluatorOutput { + val value = (node as BoolLiteralNode).token.value as Boolean + return EvaluatorOutput.value(Value.bool(value)) + } +} \ No newline at end of file diff --git a/src/main/kotlin/evaluation/evaluator/Evaluator.kt b/src/main/kotlin/evaluation/evaluator/Evaluator.kt index b1b78c6..913c40b 100644 --- a/src/main/kotlin/evaluation/evaluator/Evaluator.kt +++ b/src/main/kotlin/evaluation/evaluator/Evaluator.kt @@ -4,15 +4,16 @@ import dsl.ast.model.node.Node import evaluation.environment.Environment import evaluation.model.entity.EvaluatorOutput import evaluation.model.enumeration.EvaluationResult +import kotlin.reflect.KClass interface Evaluator { fun evaluate(node: Node, environment: Environment): EvaluatorOutput companion object { - fun forward(evaluator: Evaluator, vararg nodes: Node): Evaluator { + fun forward(evaluator: Evaluator, vararg nodes: KClass): Evaluator { return object : Evaluator { override fun evaluate(node: Node, environment: Environment): EvaluatorOutput { - if(nodes.map { it::class }.any { it.isInstance(node) }) { + if(nodes.any { it.isInstance(node) }) { return evaluator.evaluate(node, environment) } diff --git a/src/main/kotlin/evaluation/evaluator/FloatLiteralEvaluator.kt b/src/main/kotlin/evaluation/evaluator/FloatLiteralEvaluator.kt new file mode 100644 index 0000000..c362eb8 --- /dev/null +++ b/src/main/kotlin/evaluation/evaluator/FloatLiteralEvaluator.kt @@ -0,0 +1,14 @@ +package evaluation.evaluator + +import data.model.Value +import dsl.ast.model.node.FloatLiteralNode +import dsl.ast.model.node.Node +import evaluation.environment.Environment +import evaluation.model.entity.EvaluatorOutput + +class FloatLiteralEvaluator : Evaluator { + override fun evaluate(node: Node, environment: Environment): EvaluatorOutput { + val value = (node as FloatLiteralNode).token.value as Float + return EvaluatorOutput.value(Value.float(value)) + } +} \ No newline at end of file diff --git a/src/main/kotlin/evaluation/evaluator/IntegerLiteralEvaluator.kt b/src/main/kotlin/evaluation/evaluator/IntegerLiteralEvaluator.kt new file mode 100644 index 0000000..fcf598c --- /dev/null +++ b/src/main/kotlin/evaluation/evaluator/IntegerLiteralEvaluator.kt @@ -0,0 +1,14 @@ +package evaluation.evaluator + +import data.model.Value +import dsl.ast.model.node.IntegerLiteralNode +import dsl.ast.model.node.Node +import evaluation.environment.Environment +import evaluation.model.entity.EvaluatorOutput + +class IntegerLiteralEvaluator : Evaluator { + override fun evaluate(node: Node, environment: Environment): EvaluatorOutput { + val value = (node as IntegerLiteralNode).token.value as Int + return EvaluatorOutput.value(Value.int(value)) + } +} \ No newline at end of file diff --git a/src/main/kotlin/evaluation/evaluator/ListEvaluator.kt b/src/main/kotlin/evaluation/evaluator/ListEvaluator.kt new file mode 100644 index 0000000..9831ae8 --- /dev/null +++ b/src/main/kotlin/evaluation/evaluator/ListEvaluator.kt @@ -0,0 +1,17 @@ +package evaluation.evaluator + +import data.model.Value +import dsl.ast.model.node.ListNode +import dsl.ast.model.node.Node +import evaluation.environment.Environment +import evaluation.model.entity.EvaluatorOutput + +class ListEvaluator : Evaluator { + override fun evaluate(node: Node, environment: Environment): EvaluatorOutput { + val atomEvaluator = RootEvaluator() + val items = (node as ListNode).items + .map { atomEvaluator.evaluate(it, environment) } + .map { it.value!! } + return EvaluatorOutput.value(Value.list(items)) + } +} \ No newline at end of file diff --git a/src/main/kotlin/evaluation/evaluator/MapEvaluator.kt b/src/main/kotlin/evaluation/evaluator/MapEvaluator.kt new file mode 100644 index 0000000..d2c75e8 --- /dev/null +++ b/src/main/kotlin/evaluation/evaluator/MapEvaluator.kt @@ -0,0 +1,20 @@ +package evaluation.evaluator + +import data.model.Value +import dsl.ast.model.node.MapEntryNode +import dsl.ast.model.node.MapNode +import dsl.ast.model.node.Node +import evaluation.environment.Environment +import evaluation.model.entity.EvaluatorOutput + +class MapEvaluator : Evaluator { + override fun evaluate(node: Node, environment: Environment): EvaluatorOutput { + val atomEvaluator = RootEvaluator() + val value = (node as MapNode).items + .map { it as MapEntryNode } + .map { atomEvaluator.evaluate(it.key, environment).value!! to atomEvaluator.evaluate(it.value, environment).value!! } + .toMap() + + return EvaluatorOutput.value(Value.map(value)) + } +} \ No newline at end of file diff --git a/src/main/kotlin/evaluation/evaluator/NoteLiteralEvaluator.kt b/src/main/kotlin/evaluation/evaluator/NoteLiteralEvaluator.kt new file mode 100644 index 0000000..aa8736d --- /dev/null +++ b/src/main/kotlin/evaluation/evaluator/NoteLiteralEvaluator.kt @@ -0,0 +1,15 @@ +package evaluation.evaluator + +import data.entity.Note +import data.model.Value +import dsl.ast.model.node.Node +import dsl.ast.model.node.NoteLiteralNode +import evaluation.environment.Environment +import evaluation.model.entity.EvaluatorOutput + +class NoteLiteralEvaluator : Evaluator { + override fun evaluate(node: Node, environment: Environment): EvaluatorOutput { + val value = (node as NoteLiteralNode).token.value as Note + return EvaluatorOutput.value(Value.note(value)) + } +} \ No newline at end of file diff --git a/src/main/kotlin/evaluation/evaluator/RootEvaluator.kt b/src/main/kotlin/evaluation/evaluator/RootEvaluator.kt new file mode 100644 index 0000000..0039575 --- /dev/null +++ b/src/main/kotlin/evaluation/evaluator/RootEvaluator.kt @@ -0,0 +1,21 @@ +package evaluation.evaluator + +import dsl.ast.model.node.* +import evaluation.environment.Environment +import evaluation.evaluator.Evaluator.Companion.forward +import evaluation.evaluator.Evaluator.Companion.oneOf +import evaluation.model.entity.EvaluatorOutput + +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) + } +} \ No newline at end of file diff --git a/src/main/kotlin/evaluation/evaluator/StringLiteralEvaluator.kt b/src/main/kotlin/evaluation/evaluator/StringLiteralEvaluator.kt new file mode 100644 index 0000000..fc6908f --- /dev/null +++ b/src/main/kotlin/evaluation/evaluator/StringLiteralEvaluator.kt @@ -0,0 +1,14 @@ +package evaluation.evaluator + +import data.model.Value +import dsl.ast.model.node.Node +import dsl.ast.model.node.StringLiteralNode +import evaluation.environment.Environment +import evaluation.model.entity.EvaluatorOutput + +class StringLiteralEvaluator : Evaluator { + override fun evaluate(node: Node, environment: Environment): EvaluatorOutput { + val value = (node as StringLiteralNode).token.value as String + return EvaluatorOutput.value(Value.string(value)) + } +} \ No newline at end of file