From 81b5ccee50b34976d8e611af6815110bc10496f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Fri, 6 Mar 2020 21:55:54 +0100 Subject: [PATCH] Migrate function definition parser to Kotlin --- .../node/FunctionDefinitionArgumentsNode.kt | 5 +++++ .../ast/model/node/FunctionDefinitionNode.kt | 20 +++++++++++++++++++ .../FunctionDefinitionArgumentParser.kt | 13 ++++++++++++ .../FunctionDefinitionArgumentsParser.kt | 8 ++++++++ .../ast/parser/FunctionDefinitionParser.kt | 19 ++++++++++++++++++ 5 files changed, 65 insertions(+) create mode 100644 src/main/kotlin/dsl/ast/model/node/FunctionDefinitionArgumentsNode.kt create mode 100644 src/main/kotlin/dsl/ast/model/node/FunctionDefinitionNode.kt create mode 100644 src/main/kotlin/dsl/ast/parser/FunctionDefinitionArgumentParser.kt create mode 100644 src/main/kotlin/dsl/ast/parser/FunctionDefinitionArgumentsParser.kt create mode 100644 src/main/kotlin/dsl/ast/parser/FunctionDefinitionParser.kt diff --git a/src/main/kotlin/dsl/ast/model/node/FunctionDefinitionArgumentsNode.kt b/src/main/kotlin/dsl/ast/model/node/FunctionDefinitionArgumentsNode.kt new file mode 100644 index 0000000..839b6b6 --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/FunctionDefinitionArgumentsNode.kt @@ -0,0 +1,5 @@ +package dsl.ast.model.node + +import dsl.token.model.entity.TokenPosition + +class FunctionDefinitionArgumentsNode(items: List, position: TokenPosition) : AbstractIterableNode(items, position) \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/FunctionDefinitionNode.kt b/src/main/kotlin/dsl/ast/model/node/FunctionDefinitionNode.kt new file mode 100644 index 0000000..3d92df7 --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/FunctionDefinitionNode.kt @@ -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 + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/parser/FunctionDefinitionArgumentParser.kt b/src/main/kotlin/dsl/ast/parser/FunctionDefinitionArgumentParser.kt new file mode 100644 index 0000000..2a8f8d0 --- /dev/null +++ b/src/main/kotlin/dsl/ast/parser/FunctionDefinitionArgumentParser.kt @@ -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) + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/parser/FunctionDefinitionArgumentsParser.kt b/src/main/kotlin/dsl/ast/parser/FunctionDefinitionArgumentsParser.kt new file mode 100644 index 0000000..8266520 --- /dev/null +++ b/src/main/kotlin/dsl/ast/parser/FunctionDefinitionArgumentsParser.kt @@ -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) +}) \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/parser/FunctionDefinitionParser.kt b/src/main/kotlin/dsl/ast/parser/FunctionDefinitionParser.kt new file mode 100644 index 0000000..76e8437 --- /dev/null +++ b/src/main/kotlin/dsl/ast/parser/FunctionDefinitionParser.kt @@ -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) + } +} \ No newline at end of file