From f46fcdfc6a807e73266d6bcdf92c33777fd52077 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Fri, 6 Mar 2020 19:09:27 +0100 Subject: [PATCH] Migrate type parser to Kotlin --- src/main/kotlin/dsl/ast/model/node/TypeNode.kt | 14 ++++++++++++++ .../dsl/ast/model/node/TypeSpecifierNode.kt | 5 +++++ .../dsl/ast/model/node/TypeSpecifiersNode.kt | 5 +++++ src/main/kotlin/dsl/ast/parser/TypeParser.kt | 17 +++++++++++++++++ .../dsl/ast/parser/TypeSpecifierParser.kt | 8 ++++++++ 5 files changed, 49 insertions(+) create mode 100644 src/main/kotlin/dsl/ast/model/node/TypeNode.kt create mode 100644 src/main/kotlin/dsl/ast/model/node/TypeSpecifierNode.kt create mode 100644 src/main/kotlin/dsl/ast/model/node/TypeSpecifiersNode.kt create mode 100644 src/main/kotlin/dsl/ast/parser/TypeParser.kt create mode 100644 src/main/kotlin/dsl/ast/parser/TypeSpecifierParser.kt diff --git a/src/main/kotlin/dsl/ast/model/node/TypeNode.kt b/src/main/kotlin/dsl/ast/model/node/TypeNode.kt new file mode 100644 index 0000000..8ae9cc6 --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/TypeNode.kt @@ -0,0 +1,14 @@ +package dsl.ast.model.node + +class TypeNode(type: Node, specifiers: Node) : Node(2, type.position) { + val type: Node + get() = children[0] + + val specifiers: Node + get() = children[1] + + init { + children[0] = type + children[1] = specifiers + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/TypeSpecifierNode.kt b/src/main/kotlin/dsl/ast/model/node/TypeSpecifierNode.kt new file mode 100644 index 0000000..56e54a1 --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/TypeSpecifierNode.kt @@ -0,0 +1,5 @@ +package dsl.ast.model.node + +import dsl.token.model.entity.TokenPosition + +class TypeSpecifierNode(items: List, position: TokenPosition) : AbstractIterableNode(items, position) \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/TypeSpecifiersNode.kt b/src/main/kotlin/dsl/ast/model/node/TypeSpecifiersNode.kt new file mode 100644 index 0000000..2ff0c5a --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/TypeSpecifiersNode.kt @@ -0,0 +1,5 @@ +package dsl.ast.model.node + +import dsl.token.model.entity.TokenPosition + +class TypeSpecifiersNode(specifiers: List, position: TokenPosition) : Node(specifiers, position) \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/parser/TypeParser.kt b/src/main/kotlin/dsl/ast/parser/TypeParser.kt new file mode 100644 index 0000000..e34a908 --- /dev/null +++ b/src/main/kotlin/dsl/ast/parser/TypeParser.kt @@ -0,0 +1,17 @@ +package dsl.ast.parser + +import dsl.ast.model.entity.ParserOutput +import dsl.ast.model.node.TypeNode +import dsl.ast.model.node.TypeSpecifiersNode +import dsl.token.model.entity.TokenList + +class TypeParser : Parser() { + override fun tryToParse(input: TokenList): ParserOutput { + return allOf(listOf( + SimpleIdentifierParser(), + optional(repeat(TypeSpecifierParser()) { list, tokenPosition -> TypeSpecifiersNode(list, tokenPosition) }) + )) { + TypeNode(it[0], it[1]) + }.parse(input) + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/parser/TypeSpecifierParser.kt b/src/main/kotlin/dsl/ast/parser/TypeSpecifierParser.kt new file mode 100644 index 0000000..e460e53 --- /dev/null +++ b/src/main/kotlin/dsl/ast/parser/TypeSpecifierParser.kt @@ -0,0 +1,8 @@ +package dsl.ast.parser + +import dsl.ast.model.node.TypeSpecifierNode +import dsl.token.model.enumeration.TokenType + +class TypeSpecifierParser : AbstractIterableParser(TokenType.OPEN_ANGLE, TypeParser(), TokenType.CLOSE_ANGLE, { + list, tokenPosition -> TypeSpecifierNode(list, tokenPosition) +}) \ No newline at end of file