Migrate function call and assignment operator parsers to Kotlin

This commit is contained in:
2020-03-06 18:39:19 +01:00
parent d1da81afd9
commit e8d57629e3
13 changed files with 84 additions and 6 deletions

View File

@@ -2,5 +2,5 @@ import interpreter.Interpreter
fun main(args: Array<String>) {
val interpreter = Interpreter()
interpreter.run("{ [2, 3, 4] as (i, j, k) ^ { x y z } % i == 2 [1, xyz, [true, { 1 -> false, 2 -> { @c -> @d, @e -> false } }, [@c], 4, \"h\"]] 2 @c @d * 3.14 }")
interpreter.run("{ a = b = c = [2, 3, 4] as (i, j, k) ^ { x y z(1, 2, c(), {a -> b() }) } % i == 2 [1, xyz, [true, { 1 -> false, 2 -> { @c -> @d, @e -> false } }, [@c], 4, \"h\"]] 2 @c @d * 3.14 }")
}

View File

@@ -0,0 +1,3 @@
package dsl.ast.model.node
class AssignmentOperatorNode(lhs: Node, operator: Node, rhs: Node) : BinaryOperatorAbstractNode(lhs, operator, rhs)

View File

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

View File

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

View File

@@ -0,0 +1,18 @@
package dsl.ast.parser
import dsl.ast.model.entity.ParserOutput
import dsl.ast.model.node.AssignmentOperatorNode
import dsl.token.model.entity.TokenList
import dsl.token.model.enumeration.TokenType
class AssignmentOperatorParser : Parser() {
override fun tryToParse(input: TokenList): ParserOutput {
return allOf(listOf(
SimpleIdentifierParser(),
terminal(TokenType.ASSIGN),
assert(ExpressionParser(), "expression")
)) {
AssignmentOperatorNode(it[0], it[1], it[2])
}.parse(input)
}
}

View File

@@ -19,7 +19,7 @@ class AtomParser : Parser() {
val literalParser = oneOf(
listOf(
parenthesesParser,
IdentifierParser(),
ComplexIdentifierParser(),
ListParser(),
LiteralParser(),
MapParser()

View File

@@ -0,0 +1,14 @@
package dsl.ast.parser
import dsl.ast.model.entity.ParserOutput
import dsl.token.model.entity.TokenList
class ComplexIdentifierParser : Parser() {
override fun tryToParse(input: TokenList): ParserOutput {
return oneOf(listOf(
AssignmentOperatorParser(),
FunctionCallParser(),
SimpleIdentifierParser()
)).parse(input)
}
}

View File

@@ -0,0 +1,8 @@
package dsl.ast.parser
import dsl.ast.model.node.FunctionCallArgumentsNode
import dsl.token.model.enumeration.TokenType
class FunctionCallArgumentsParser : AbstractIterableParser(TokenType.OPEN_PAREN, ExpressionParser(), TokenType.CLOSE_PAREN, {
list, tokenPosition -> FunctionCallArgumentsNode(list, tokenPosition)
})

View File

@@ -0,0 +1,16 @@
package dsl.ast.parser
import dsl.ast.model.entity.ParserOutput
import dsl.ast.model.node.FunctionCallNode
import dsl.token.model.entity.TokenList
class FunctionCallParser : Parser() {
override fun tryToParse(input: TokenList): ParserOutput {
return allOf(listOf(
SimpleIdentifierParser(),
FunctionCallArgumentsParser()
)) {
FunctionCallNode(it[0], it[1])
}.parse(input)
}
}

View File

@@ -3,6 +3,6 @@ package dsl.ast.parser
import dsl.ast.model.node.LoopParametersNode
import dsl.token.model.enumeration.TokenType
class LoopParametersParser : AbstractIterableParser(TokenType.OPEN_PAREN, IdentifierParser(), TokenType.CLOSE_PAREN, {
class LoopParametersParser : AbstractIterableParser(TokenType.OPEN_PAREN, SimpleIdentifierParser(), TokenType.CLOSE_PAREN, {
list, tokenPosition -> LoopParametersNode(list, tokenPosition)
})

View File

@@ -11,7 +11,7 @@ class LoopParser : Parser() {
val loopParametersParser = allOf(listOf(
terminal(TokenType.AS),
oneOf(listOf(
mapNode(IdentifierParser()) { LoopParametersNode(listOf(it), it.position) },
mapNode(SimpleIdentifierParser()) { LoopParametersNode(listOf(it), it.position) },
LoopParametersParser()
))
)) { it[1] }

View File

@@ -9,7 +9,7 @@ class MapEntryParser : Parser() {
override fun tryToParse(input: TokenList): ParserOutput {
val keyParser = oneOf(listOf(
LiteralParser(),
IdentifierParser()
SimpleIdentifierParser()
))
return allOf(listOf(

View File

@@ -5,7 +5,7 @@ import dsl.ast.model.node.IdentifierNode
import dsl.token.model.entity.TokenList
import dsl.token.model.enumeration.TokenType
class IdentifierParser : Parser() {
class SimpleIdentifierParser : Parser() {
override fun tryToParse(input: TokenList): ParserOutput {
val identifierParser = terminal(TokenType.IDENTIFIER) { IdentifierNode(it) }