Extract some fundamental metadata structure to io.smnp.api package
This commit is contained in:
@@ -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>))
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package io.smnp.data.enumeration
|
||||
package io.smnp.api.enumeration
|
||||
|
||||
import io.smnp.data.entity.Note
|
||||
import kotlin.reflect.KClass
|
||||
4
src/main/kotlin/io/smnp/api/environment/Environment.kt
Normal file
4
src/main/kotlin/io/smnp/api/environment/Environment.kt
Normal file
@@ -0,0 +1,4 @@
|
||||
package io.smnp.api.environment
|
||||
|
||||
class Environment {
|
||||
}
|
||||
@@ -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 {
|
||||
@@ -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]
|
||||
@@ -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)),
|
||||
@@ -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
|
||||
@@ -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(", ")})"
|
||||
@@ -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 {
|
||||
@@ -1,4 +0,0 @@
|
||||
package io.smnp.evaluation.environment
|
||||
|
||||
class Environment {
|
||||
}
|
||||
@@ -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() {
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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?) {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user