Migrate identifier and map parsers to Kotlin

This commit is contained in:
2020-03-06 18:02:07 +01:00
parent 6e9d3d06fb
commit 52dcaacb58
8 changed files with 91 additions and 6 deletions

View File

@@ -0,0 +1,5 @@
package dsl.ast.model.node
import dsl.token.model.entity.Token
class IdentifierNode(token: Token) : AtomAbstractNode(token)

View File

@@ -0,0 +1,14 @@
package dsl.ast.model.node
class MapEntryNode(key: Node, operator: Node, value: Node) : Node(2, operator.position) {
val key: Node
get() = children[0]
val value: Node
get() = children[1]
init {
children[0] = key
children[1] = value
}
}

View File

@@ -0,0 +1,5 @@
package dsl.ast.model.node
import dsl.token.model.entity.TokenPosition
class MapNode(items: List<Node>, position: TokenPosition) : AbstractIterableNode(items, position)

View File

@@ -19,12 +19,10 @@ class AtomParser : Parser() {
val literalParser = oneOf(
listOf(
parenthesesParser,
BoolLiteralParser(),
FloatLiteralParser(),
IntegerLiteralParser(),
NoteLiteralParser(),
StringLiteralParser(),
ListParser()
IdentifierParser(),
ListParser(),
LiteralParser(),
MapParser()
)
)

View File

@@ -0,0 +1,16 @@
package dsl.ast.parser
import dsl.ast.model.entity.ParserOutput
import dsl.ast.model.node.IdentifierNode
import dsl.token.model.entity.TokenList
import dsl.token.model.enumeration.TokenType
class IdentifierParser : Parser() {
override fun tryToParse(input: TokenList): ParserOutput {
val identifierParser = terminal(TokenType.IDENTIFIER) { IdentifierNode(it) }
return oneOf(listOf(
identifierParser
)).parse(input)
}
}

View File

@@ -0,0 +1,16 @@
package dsl.ast.parser
import dsl.ast.model.entity.ParserOutput
import dsl.token.model.entity.TokenList
class LiteralParser : Parser() {
override fun tryToParse(input: TokenList): ParserOutput {
return oneOf(listOf(
BoolLiteralParser(),
FloatLiteralParser(),
IntegerLiteralParser(),
NoteLiteralParser(),
StringLiteralParser()
)).parse(input)
}
}

View File

@@ -0,0 +1,23 @@
package dsl.ast.parser
import dsl.ast.model.entity.ParserOutput
import dsl.ast.model.node.MapEntryNode
import dsl.token.model.entity.TokenList
import dsl.token.model.enumeration.TokenType
class MapEntryParser : Parser() {
override fun tryToParse(input: TokenList): ParserOutput {
val keyParser = oneOf(listOf(
LiteralParser(),
IdentifierParser()
))
return allOf(listOf(
keyParser,
terminal(TokenType.ARROW),
assert(ExpressionParser(), "expression")
)) {
MapEntryNode(it[0], it[1], it[2])
}.parse(input)
}
}

View File

@@ -0,0 +1,8 @@
package dsl.ast.parser
import dsl.ast.model.node.MapNode
import dsl.token.model.enumeration.TokenType
class MapParser : AbstractIterableParser(TokenType.OPEN_CURLY, MapEntryParser(), TokenType.CLOSE_CURLY, {
list, tokenPosition -> MapNode(list, tokenPosition)
})