Migrate function definition parser to Kotlin

This commit is contained in:
2020-03-06 21:55:54 +01:00
parent 3be119c353
commit 81b5ccee50
5 changed files with 65 additions and 0 deletions

View File

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

View File

@@ -0,0 +1,20 @@
package dsl.ast.model.node
import dsl.token.model.entity.TokenPosition
class FunctionDefinitionNode(identifier: Node, arguments: Node, body: Node, position: TokenPosition) : Node(3, position) {
val identifier: Node
get() = children[0]
val arguments: Node
get() = children[1]
val body: Node
get() = children[2]
init {
children[0] = identifier
children[1] = arguments
children[2] = body
}
}

View File

@@ -0,0 +1,13 @@
package dsl.ast.parser
import dsl.ast.model.entity.ParserOutput
import dsl.token.model.entity.TokenList
class FunctionDefinitionArgumentParser : Parser() {
override fun tryToParse(input: TokenList): ParserOutput {
return oneOf(listOf(
OptionalFunctionDefinitionArgumentParser(),
RegularFunctionDefinitionArgumentParser()
)).parse(input)
}
}

View File

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

View File

@@ -0,0 +1,19 @@
package dsl.ast.parser
import dsl.ast.model.entity.ParserOutput
import dsl.ast.model.node.FunctionDefinitionNode
import dsl.token.model.entity.TokenList
import dsl.token.model.enumeration.TokenType
class FunctionDefinitionParser : Parser() {
override fun tryToParse(input: TokenList): ParserOutput {
return allOf(listOf(
terminal(TokenType.FUNCTION),
assert(SimpleIdentifierParser(), "function/method name"),
assert(FunctionDefinitionArgumentsParser(), "function/method arguments list"),
assert(BlockParser(), "function/method body")
)) {
FunctionDefinitionNode(it[1], it[2], it[3], it[0].position)
}.parse(input)
}
}