From 3be119c353cbbbc6bf2c641a9ad770f29ffc4001 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Fri, 6 Mar 2020 21:44:24 +0100 Subject: [PATCH] Migrate function definition argument parser to Kotlin --- .../OptionalFunctionDefinitionArgumentNode.kt | 18 +++++++++++++++ .../RegularFunctionDefinitionArgumentNode.kt | 18 +++++++++++++++ ...ptionalFunctionDefinitionArgumentParser.kt | 22 +++++++++++++++++++ ...RegularFunctionDefinitionArgumentParser.kt | 21 ++++++++++++++++++ .../dsl/token/model/enumeration/TokenType.kt | 1 + .../dsl/token/tokenizer/DefaultTokenizer.kt | 1 + 6 files changed, 81 insertions(+) create mode 100644 src/main/kotlin/dsl/ast/model/node/OptionalFunctionDefinitionArgumentNode.kt create mode 100644 src/main/kotlin/dsl/ast/model/node/RegularFunctionDefinitionArgumentNode.kt create mode 100644 src/main/kotlin/dsl/ast/parser/OptionalFunctionDefinitionArgumentParser.kt create mode 100644 src/main/kotlin/dsl/ast/parser/RegularFunctionDefinitionArgumentParser.kt diff --git a/src/main/kotlin/dsl/ast/model/node/OptionalFunctionDefinitionArgumentNode.kt b/src/main/kotlin/dsl/ast/model/node/OptionalFunctionDefinitionArgumentNode.kt new file mode 100644 index 0000000..80347d0 --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/OptionalFunctionDefinitionArgumentNode.kt @@ -0,0 +1,18 @@ +package dsl.ast.model.node + +class OptionalFunctionDefinitionArgumentNode(identifier: Node, type: Node, defaultValue: Node) : Node(3, identifier.position) { + val identifier: Node + get() = children[0] + + val type: Node + get() = children[1] + + val defaultValue: Node + get() = children[2] + + init { + children[0] = identifier + children[1] = type + children[2] = defaultValue + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/RegularFunctionDefinitionArgumentNode.kt b/src/main/kotlin/dsl/ast/model/node/RegularFunctionDefinitionArgumentNode.kt new file mode 100644 index 0000000..5dd9495 --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/RegularFunctionDefinitionArgumentNode.kt @@ -0,0 +1,18 @@ +package dsl.ast.model.node + +class RegularFunctionDefinitionArgumentNode(identifier: Node, type: Node, vararg: Node) : Node(3, identifier.position) { + val identifier + get() = children[0] + + val type + get() = children[1] + + val vararg + get() = children[2] + + init { + children[0] = identifier + children[1] = type + children[2] = vararg + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/parser/OptionalFunctionDefinitionArgumentParser.kt b/src/main/kotlin/dsl/ast/parser/OptionalFunctionDefinitionArgumentParser.kt new file mode 100644 index 0000000..5400caf --- /dev/null +++ b/src/main/kotlin/dsl/ast/parser/OptionalFunctionDefinitionArgumentParser.kt @@ -0,0 +1,22 @@ +package dsl.ast.parser + +import dsl.ast.model.entity.ParserOutput +import dsl.ast.model.node.OptionalFunctionDefinitionArgumentNode +import dsl.token.model.entity.TokenList +import dsl.token.model.enumeration.TokenType + +class OptionalFunctionDefinitionArgumentParser : Parser() { + override fun tryToParse(input: TokenList): ParserOutput { + return allOf(listOf( + SimpleIdentifierParser(), + optional(allOf(listOf( + terminal(TokenType.COLON), + TypeParser() + )){ it[1] }), + terminal(TokenType.ASSIGN), + assert(ExpressionParser(), "expression") + )) { + OptionalFunctionDefinitionArgumentNode(it[0], it[1], it[3]) + }.parse(input) + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/parser/RegularFunctionDefinitionArgumentParser.kt b/src/main/kotlin/dsl/ast/parser/RegularFunctionDefinitionArgumentParser.kt new file mode 100644 index 0000000..1f31abc --- /dev/null +++ b/src/main/kotlin/dsl/ast/parser/RegularFunctionDefinitionArgumentParser.kt @@ -0,0 +1,21 @@ +package dsl.ast.parser + +import dsl.ast.model.entity.ParserOutput +import dsl.ast.model.node.RegularFunctionDefinitionArgumentNode +import dsl.token.model.entity.TokenList +import dsl.token.model.enumeration.TokenType + +class RegularFunctionDefinitionArgumentParser : Parser() { + override fun tryToParse(input: TokenList): ParserOutput { + return allOf(listOf( + optional(terminal(TokenType.DOTS)), + SimpleIdentifierParser(), + optional(allOf(listOf( + terminal(TokenType.COLON), + TypeParser() + )){ it[1] }) + )) { + RegularFunctionDefinitionArgumentNode(it[1], it[2], it[0]) + }.parse(input) + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/token/model/enumeration/TokenType.kt b/src/main/kotlin/dsl/token/model/enumeration/TokenType.kt index 2e2412f..d131d96 100644 --- a/src/main/kotlin/dsl/token/model/enumeration/TokenType.kt +++ b/src/main/kotlin/dsl/token/model/enumeration/TokenType.kt @@ -17,6 +17,7 @@ enum class TokenType(val token: String) { PERCENT("%"), ASSIGN("="), ARROW("->"), + COLON(":"), COMMA(","), SLASH("/"), MINUS("-"), diff --git a/src/main/kotlin/dsl/token/tokenizer/DefaultTokenizer.kt b/src/main/kotlin/dsl/token/tokenizer/DefaultTokenizer.kt index d4f44d6..6ddeedf 100644 --- a/src/main/kotlin/dsl/token/tokenizer/DefaultTokenizer.kt +++ b/src/main/kotlin/dsl/token/tokenizer/DefaultTokenizer.kt @@ -31,6 +31,7 @@ class DefaultTokenizer : Tokenizer { default(TokenType.ASTERISK), default(TokenType.PERCENT), default(TokenType.ASSIGN), + default(TokenType.COLON), default(TokenType.COMMA), default(TokenType.SLASH), default(TokenType.MINUS),