Extract some fundamental metadata structure to io.smnp.api package

This commit is contained in:
2020-03-07 23:11:59 +01:00
parent 945df28a29
commit 634ea2711b
34 changed files with 105 additions and 73 deletions

View File

@@ -1,21 +1,32 @@
package io.smnp
import io.smnp.api.enumeration.DataType
import io.smnp.api.model.Value
import io.smnp.api.matcher.Matcher.Companion.listOf
import io.smnp.api.matcher.Matcher.Companion.ofType
import io.smnp.api.signature.Signature
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
import io.smnp.evaluation.evaluator.DefaultEvaluator
fun main(args: Array<String>) {
val code = "{ \"a\" -> [14, 15, 16], 4 -> @c }"
val code = "[false, [@D], 1, 2, 3, 4]"
val tokenizer = DefaultTokenizer()
val parser = RootParser()
val evaluator = RootEvaluator()
val evaluator = DefaultEvaluator()
val lines = code.split("\n")
val tokens = tokenizer.tokenize(lines)
val ast = parser.parse(tokens)
val value = evaluator.evaluate(ast.node, Environment())
println(value)
val value = evaluator.evaluate(ast.node.children[0], Environment()).value!!
val signature = Signature.vararg(ofType(DataType.INT), ofType(
DataType.BOOL), listOf(DataType.NOTE))
println(signature)
println(signature.parse(value.value!! as List<Value>))
}

View File

@@ -1,4 +1,4 @@
package io.smnp.data.enumeration
package io.smnp.api.enumeration
import io.smnp.data.entity.Note
import kotlin.reflect.KClass

View File

@@ -0,0 +1,4 @@
package io.smnp.api.environment
class Environment {
}

View File

@@ -1,7 +1,7 @@
package io.smnp.data.signature
package io.smnp.api.matcher
import io.smnp.data.enumeration.DataType
import io.smnp.data.model.Value
import io.smnp.api.enumeration.DataType
import io.smnp.api.model.Value
class Matcher(val type: DataType?, private val matcher: (Value) -> Boolean, private val string: String, val optional: Boolean = false) {
@@ -32,7 +32,12 @@ class Matcher(val type: DataType?, private val matcher: (Value) -> Boolean, priv
companion object {
fun optional(matcher: Matcher): Matcher {
return Matcher(matcher.type, matcher.matcher, "${matcher.string}?", true)
return Matcher(
matcher.type,
matcher.matcher,
"${matcher.string}?",
true
)
}
fun mapOfMatchers(keyMatchers: List<Matcher>, valueMatchers: List<Matcher>): Matcher {
@@ -92,7 +97,11 @@ class Matcher(val type: DataType?, private val matcher: (Value) -> Boolean, priv
}
fun ofTypes(vararg types: DataType): Matcher {
return Matcher(null, { it.type in types }, "<${types.joinToString(", ") { it.name.toLowerCase() }}>")
return Matcher(
null,
{ it.type in types },
"<${types.joinToString(", ") { it.name.toLowerCase() }}>"
)
}
fun ofType(type: DataType): Matcher {

View File

@@ -1,6 +1,4 @@
package io.smnp.data.signature
import io.smnp.data.model.Value
package io.smnp.api.model
class ArgumentsList(val isValid: Boolean, val arguments: List<Value>) {
operator fun get(index: Int) = arguments[index]

View File

@@ -1,7 +1,7 @@
package io.smnp.data.model
package io.smnp.api.model
import io.smnp.data.entity.Note
import io.smnp.data.enumeration.DataType
import io.smnp.api.enumeration.DataType
import io.smnp.error.ShouldNeverReachThisLineException
class Value private constructor(val type: DataType, val value: Any?, val properties: Map<String, Value> = emptyMap()) {
@@ -33,19 +33,22 @@ class Value private constructor(val type: DataType, val value: Any?, val propert
}
fun string(value: String): Value {
return Value(DataType.STRING, value, hashMapOf(
return Value(
DataType.STRING, value, hashMapOf(
Pair("length", int(value.length))
))
}
fun list(value: List<Value>): Value {
return Value(DataType.LIST, value, hashMapOf(
return Value(
DataType.LIST, value, hashMapOf(
Pair("size", int(value.size))
))
}
fun map(value: Map<Value, Value>): Value {
return Value(DataType.MAP, value, hashMapOf(
return Value(
DataType.MAP, value, hashMapOf(
Pair("size", int(value.size)),
Pair("keys", list(value.keys.toList())),
Pair("values", list(value.values.toList()))
@@ -53,7 +56,8 @@ class Value private constructor(val type: DataType, val value: Any?, val propert
}
fun note(value: Note): Value {
return Value(DataType.NOTE, value, hashMapOf(
return Value(
DataType.NOTE, value, hashMapOf(
Pair("pitch", string(value.pitch.toString())),
Pair("octave", int(value.octave)),
Pair("duration", int(value.duration)),

View File

@@ -1,6 +1,8 @@
package io.smnp.data.signature
package io.smnp.api.signature
import io.smnp.data.model.Value
import io.smnp.api.matcher.Matcher
import io.smnp.api.model.ArgumentsList
import io.smnp.api.model.Value
interface Signature {
fun parse(arguments: List<Value>): ArgumentsList

View File

@@ -1,6 +1,8 @@
package io.smnp.data.signature
package io.smnp.api.signature
import io.smnp.data.model.Value
import io.smnp.api.matcher.Matcher
import io.smnp.api.model.ArgumentsList
import io.smnp.api.model.Value
class SimpleSignature(private vararg val signature: Matcher) : Signature {
override fun parse(arguments: List<Value>): ArgumentsList {
@@ -8,7 +10,11 @@ class SimpleSignature(private vararg val signature: Matcher) : Signature {
return ArgumentsList.invalid()
}
return ArgumentsList(signature.zip(arguments).all { (matcher, argument) -> matcher.match(argument) }, arguments)
return ArgumentsList(signature.zip(arguments).all { (matcher, argument) ->
matcher.match(
argument
)
}, arguments)
}
override fun toString() = "(${signature.joinToString(", ")})"

View File

@@ -1,6 +1,8 @@
package io.smnp.data.signature
package io.smnp.api.signature
import io.smnp.data.model.Value
import io.smnp.api.matcher.Matcher
import io.smnp.api.model.ArgumentsList
import io.smnp.api.model.Value
class VarargSignature(private val varargMatcher: Matcher, private vararg val signature: Matcher) : Signature {
override fun parse(arguments: List<Value>): ArgumentsList {

View File

@@ -1,4 +0,0 @@
package io.smnp.evaluation.environment
class Environment {
}

View File

@@ -5,7 +5,7 @@ import io.smnp.dsl.ast.model.node.FunctionCallNode
import io.smnp.dsl.ast.model.node.IdentifierNode
import io.smnp.dsl.ast.model.node.Node
import io.smnp.error.EvaluationException
import io.smnp.evaluation.environment.Environment
import io.smnp.api.environment.Environment
import io.smnp.evaluation.model.entity.EvaluatorOutput
class AccessOperatorEvaluator : Evaluator() {

View File

@@ -2,7 +2,7 @@ package io.smnp.evaluation.evaluator
import io.smnp.dsl.ast.model.node.BlockNode
import io.smnp.dsl.ast.model.node.Node
import io.smnp.evaluation.environment.Environment
import io.smnp.api.environment.Environment
import io.smnp.evaluation.model.entity.EvaluatorOutput
import io.smnp.evaluation.model.enumeration.EvaluationResult

View File

@@ -1,9 +1,9 @@
package io.smnp.evaluation.evaluator
import io.smnp.data.model.Value
import io.smnp.api.model.Value
import io.smnp.dsl.ast.model.node.BoolLiteralNode
import io.smnp.dsl.ast.model.node.Node
import io.smnp.evaluation.environment.Environment
import io.smnp.api.environment.Environment
import io.smnp.evaluation.model.entity.EvaluatorOutput
class BoolLiteralEvaluator : Evaluator() {

View File

@@ -1,11 +1,11 @@
package io.smnp.evaluation.evaluator
import io.smnp.data.enumeration.DataType
import io.smnp.api.enumeration.DataType
import io.smnp.dsl.ast.model.node.ConditionNode
import io.smnp.dsl.ast.model.node.Node
import io.smnp.dsl.ast.model.node.NoneNode
import io.smnp.error.EvaluationException
import io.smnp.evaluation.environment.Environment
import io.smnp.api.environment.Environment
import io.smnp.evaluation.model.entity.EvaluatorOutput
class ConditionEvaluator : Evaluator() {

View File

@@ -1,7 +1,7 @@
package io.smnp.evaluation.evaluator
import io.smnp.dsl.ast.model.node.Node
import io.smnp.evaluation.environment.Environment
import io.smnp.api.environment.Environment
import io.smnp.evaluation.model.entity.EvaluatorOutput
class DefaultEvaluator : Evaluator() {

View File

@@ -2,7 +2,7 @@ package io.smnp.evaluation.evaluator
import io.smnp.dsl.ast.model.node.Node
import io.smnp.error.EvaluationException
import io.smnp.evaluation.environment.Environment
import io.smnp.api.environment.Environment
import io.smnp.evaluation.model.entity.EvaluatorOutput
import io.smnp.evaluation.model.enumeration.EvaluationResult
import kotlin.reflect.KClass

View File

@@ -1,7 +1,7 @@
package io.smnp.evaluation.evaluator
import io.smnp.dsl.ast.model.node.Node
import io.smnp.evaluation.environment.Environment
import io.smnp.api.environment.Environment
import io.smnp.evaluation.model.entity.EvaluatorOutput
import io.smnp.evaluation.model.enumeration.EvaluationResult

View File

@@ -1,9 +1,9 @@
package io.smnp.evaluation.evaluator
import io.smnp.data.model.Value
import io.smnp.api.model.Value
import io.smnp.dsl.ast.model.node.FloatLiteralNode
import io.smnp.dsl.ast.model.node.Node
import io.smnp.evaluation.environment.Environment
import io.smnp.api.environment.Environment
import io.smnp.evaluation.model.entity.EvaluatorOutput
class FloatLiteralEvaluator : Evaluator() {

View File

@@ -1,9 +1,9 @@
package io.smnp.evaluation.evaluator
import io.smnp.data.model.Value
import io.smnp.api.model.Value
import io.smnp.dsl.ast.model.node.IntegerLiteralNode
import io.smnp.dsl.ast.model.node.Node
import io.smnp.evaluation.environment.Environment
import io.smnp.api.environment.Environment
import io.smnp.evaluation.model.entity.EvaluatorOutput
class IntegerLiteralEvaluator : Evaluator() {

View File

@@ -1,9 +1,9 @@
package io.smnp.evaluation.evaluator
import io.smnp.data.model.Value
import io.smnp.api.model.Value
import io.smnp.dsl.ast.model.node.ListNode
import io.smnp.dsl.ast.model.node.Node
import io.smnp.evaluation.environment.Environment
import io.smnp.api.environment.Environment
import io.smnp.evaluation.model.entity.EvaluatorOutput
class ListEvaluator : Evaluator() {

View File

@@ -1,14 +1,14 @@
package io.smnp.evaluation.evaluator
import io.smnp.data.enumeration.DataType
import io.smnp.data.model.Value
import io.smnp.api.enumeration.DataType
import io.smnp.api.model.Value
import io.smnp.dsl.ast.model.node.LogicOperatorNode
import io.smnp.dsl.ast.model.node.Node
import io.smnp.dsl.ast.model.node.TokenNode
import io.smnp.dsl.token.model.enumeration.TokenType
import io.smnp.error.EvaluationException
import io.smnp.error.ShouldNeverReachThisLineException
import io.smnp.evaluation.environment.Environment
import io.smnp.api.environment.Environment
import io.smnp.evaluation.model.entity.EvaluatorOutput
class LogicOperatorEvaluator : Evaluator() {

View File

@@ -1,10 +1,10 @@
package io.smnp.evaluation.evaluator
import io.smnp.data.model.Value
import io.smnp.api.model.Value
import io.smnp.dsl.ast.model.node.MapEntryNode
import io.smnp.dsl.ast.model.node.MapNode
import io.smnp.dsl.ast.model.node.Node
import io.smnp.evaluation.environment.Environment
import io.smnp.api.environment.Environment
import io.smnp.evaluation.model.entity.EvaluatorOutput
class MapEvaluator : Evaluator() {

View File

@@ -1,11 +1,11 @@
package io.smnp.evaluation.evaluator
import io.smnp.data.enumeration.DataType
import io.smnp.data.model.Value
import io.smnp.api.enumeration.DataType
import io.smnp.api.model.Value
import io.smnp.dsl.ast.model.node.MinusOperatorNode
import io.smnp.dsl.ast.model.node.Node
import io.smnp.error.EvaluationException
import io.smnp.evaluation.environment.Environment
import io.smnp.api.environment.Environment
import io.smnp.evaluation.model.entity.EvaluatorOutput
class MinusOperatorEvaluator : Evaluator() {

View File

@@ -1,9 +1,9 @@
package io.smnp.evaluation.evaluator
import io.smnp.data.model.Value
import io.smnp.api.model.Value
import io.smnp.dsl.ast.model.node.Node
import io.smnp.dsl.ast.model.node.NotOperatorNode
import io.smnp.evaluation.environment.Environment
import io.smnp.api.environment.Environment
import io.smnp.evaluation.model.entity.EvaluatorOutput
class NotOperatorEvaluator : Evaluator() {

View File

@@ -1,10 +1,10 @@
package io.smnp.evaluation.evaluator
import io.smnp.data.entity.Note
import io.smnp.data.model.Value
import io.smnp.api.model.Value
import io.smnp.dsl.ast.model.node.Node
import io.smnp.dsl.ast.model.node.NoteLiteralNode
import io.smnp.evaluation.environment.Environment
import io.smnp.api.environment.Environment
import io.smnp.evaluation.model.entity.EvaluatorOutput
class NoteLiteralEvaluator : Evaluator() {

View File

@@ -1,10 +1,10 @@
package io.smnp.evaluation.evaluator
import io.smnp.data.model.Value
import io.smnp.api.model.Value
import io.smnp.dsl.ast.model.node.Node
import io.smnp.dsl.ast.model.node.PowerOperatorNode
import io.smnp.error.EvaluationException
import io.smnp.evaluation.environment.Environment
import io.smnp.api.environment.Environment
import io.smnp.evaluation.model.entity.EvaluatorOutput
import kotlin.math.pow

View File

@@ -1,13 +1,13 @@
package io.smnp.evaluation.evaluator
import io.smnp.data.model.Value
import io.smnp.api.model.Value
import io.smnp.dsl.ast.model.node.Node
import io.smnp.dsl.ast.model.node.ProductOperatorNode
import io.smnp.dsl.ast.model.node.TokenNode
import io.smnp.dsl.token.model.enumeration.TokenType
import io.smnp.error.EvaluationException
import io.smnp.error.ShouldNeverReachThisLineException
import io.smnp.evaluation.environment.Environment
import io.smnp.api.environment.Environment
import io.smnp.evaluation.model.entity.EvaluatorOutput
import io.smnp.evaluation.util.NumberUnification.unify

View File

@@ -1,12 +1,12 @@
package io.smnp.evaluation.evaluator
import io.smnp.data.model.Value
import io.smnp.api.model.Value
import io.smnp.dsl.ast.model.node.Node
import io.smnp.dsl.ast.model.node.RelationOperatorNode
import io.smnp.dsl.ast.model.node.TokenNode
import io.smnp.error.EvaluationException
import io.smnp.error.ShouldNeverReachThisLineException
import io.smnp.evaluation.environment.Environment
import io.smnp.api.environment.Environment
import io.smnp.evaluation.model.entity.EvaluatorOutput
import io.smnp.evaluation.util.NumberUnification.unify

View File

@@ -2,7 +2,7 @@ package io.smnp.evaluation.evaluator
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.api.environment.Environment
import io.smnp.evaluation.model.entity.EvaluatorOutput
import io.smnp.evaluation.model.enumeration.EvaluationResult

View File

@@ -1,9 +1,9 @@
package io.smnp.evaluation.evaluator
import io.smnp.data.model.Value
import io.smnp.api.model.Value
import io.smnp.dsl.ast.model.node.Node
import io.smnp.dsl.ast.model.node.StringLiteralNode
import io.smnp.evaluation.environment.Environment
import io.smnp.api.environment.Environment
import io.smnp.evaluation.model.entity.EvaluatorOutput
class StringLiteralEvaluator : Evaluator() {

View File

@@ -1,13 +1,13 @@
package io.smnp.evaluation.evaluator
import io.smnp.data.model.Value
import io.smnp.api.model.Value
import io.smnp.dsl.ast.model.node.Node
import io.smnp.dsl.ast.model.node.SumOperatorNode
import io.smnp.dsl.ast.model.node.TokenNode
import io.smnp.dsl.token.model.enumeration.TokenType
import io.smnp.error.EvaluationException
import io.smnp.error.ShouldNeverReachThisLineException
import io.smnp.evaluation.environment.Environment
import io.smnp.api.environment.Environment
import io.smnp.evaluation.model.entity.EvaluatorOutput
import io.smnp.evaluation.util.NumberUnification.unify

View File

@@ -3,7 +3,7 @@ package io.smnp.evaluation.evaluator
import io.smnp.dsl.ast.model.node.Node
import io.smnp.dsl.ast.model.node.ThrowNode
import io.smnp.error.CustomException
import io.smnp.evaluation.environment.Environment
import io.smnp.api.environment.Environment
import io.smnp.evaluation.model.entity.EvaluatorOutput
class ThrowEvaluator : Evaluator() {

View File

@@ -1,6 +1,6 @@
package io.smnp.evaluation.model.entity
import io.smnp.data.model.Value
import io.smnp.api.model.Value
import io.smnp.evaluation.model.enumeration.EvaluationResult
class EvaluatorOutput private constructor(val result: EvaluationResult, val value: Value?) {

View File

@@ -1,7 +1,7 @@
package io.smnp.evaluation.util
import io.smnp.data.enumeration.DataType
import io.smnp.data.model.Value
import io.smnp.api.enumeration.DataType
import io.smnp.api.model.Value
object NumberUnification {
fun unify(vararg numbers: Value, int: (List<Int>) -> Value, float: (List<Float>) -> Value): Value {