From 52dcaacb58a0ba3f0a711010e6f642bf241cebde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Fri, 6 Mar 2020 18:02:07 +0100 Subject: [PATCH] Migrate identifier and map parsers to Kotlin --- .../dsl/ast/model/node/IdentifierNode.kt | 5 ++++ .../kotlin/dsl/ast/model/node/MapEntryNode.kt | 14 +++++++++++ src/main/kotlin/dsl/ast/model/node/MapNode.kt | 5 ++++ src/main/kotlin/dsl/ast/parser/AtomParser.kt | 10 ++++---- .../kotlin/dsl/ast/parser/IdentifierParser.kt | 16 +++++++++++++ .../kotlin/dsl/ast/parser/LiteralParser.kt | 16 +++++++++++++ .../kotlin/dsl/ast/parser/MapEntryParser.kt | 23 +++++++++++++++++++ src/main/kotlin/dsl/ast/parser/MapParser.kt | 8 +++++++ 8 files changed, 91 insertions(+), 6 deletions(-) create mode 100644 src/main/kotlin/dsl/ast/model/node/IdentifierNode.kt create mode 100644 src/main/kotlin/dsl/ast/model/node/MapEntryNode.kt create mode 100644 src/main/kotlin/dsl/ast/model/node/MapNode.kt create mode 100644 src/main/kotlin/dsl/ast/parser/IdentifierParser.kt create mode 100644 src/main/kotlin/dsl/ast/parser/LiteralParser.kt create mode 100644 src/main/kotlin/dsl/ast/parser/MapEntryParser.kt create mode 100644 src/main/kotlin/dsl/ast/parser/MapParser.kt diff --git a/src/main/kotlin/dsl/ast/model/node/IdentifierNode.kt b/src/main/kotlin/dsl/ast/model/node/IdentifierNode.kt new file mode 100644 index 0000000..2cc9536 --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/IdentifierNode.kt @@ -0,0 +1,5 @@ +package dsl.ast.model.node + +import dsl.token.model.entity.Token + +class IdentifierNode(token: Token) : AtomAbstractNode(token) \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/MapEntryNode.kt b/src/main/kotlin/dsl/ast/model/node/MapEntryNode.kt new file mode 100644 index 0000000..e734485 --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/MapEntryNode.kt @@ -0,0 +1,14 @@ +package dsl.ast.model.node + +class MapEntryNode(key: Node, operator: Node, value: Node) : Node(2, operator.position) { + val key: Node + get() = children[0] + + val value: Node + get() = children[1] + + init { + children[0] = key + children[1] = value + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/MapNode.kt b/src/main/kotlin/dsl/ast/model/node/MapNode.kt new file mode 100644 index 0000000..080d0b6 --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/MapNode.kt @@ -0,0 +1,5 @@ +package dsl.ast.model.node + +import dsl.token.model.entity.TokenPosition + +class MapNode(items: List, position: TokenPosition) : AbstractIterableNode(items, position) \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/parser/AtomParser.kt b/src/main/kotlin/dsl/ast/parser/AtomParser.kt index a5fd101..544722f 100644 --- a/src/main/kotlin/dsl/ast/parser/AtomParser.kt +++ b/src/main/kotlin/dsl/ast/parser/AtomParser.kt @@ -19,12 +19,10 @@ class AtomParser : Parser() { val literalParser = oneOf( listOf( parenthesesParser, - BoolLiteralParser(), - FloatLiteralParser(), - IntegerLiteralParser(), - NoteLiteralParser(), - StringLiteralParser(), - ListParser() + IdentifierParser(), + ListParser(), + LiteralParser(), + MapParser() ) ) diff --git a/src/main/kotlin/dsl/ast/parser/IdentifierParser.kt b/src/main/kotlin/dsl/ast/parser/IdentifierParser.kt new file mode 100644 index 0000000..03c446c --- /dev/null +++ b/src/main/kotlin/dsl/ast/parser/IdentifierParser.kt @@ -0,0 +1,16 @@ +package dsl.ast.parser + +import dsl.ast.model.entity.ParserOutput +import dsl.ast.model.node.IdentifierNode +import dsl.token.model.entity.TokenList +import dsl.token.model.enumeration.TokenType + +class IdentifierParser : Parser() { + override fun tryToParse(input: TokenList): ParserOutput { + val identifierParser = terminal(TokenType.IDENTIFIER) { IdentifierNode(it) } + + return oneOf(listOf( + identifierParser + )).parse(input) + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/parser/LiteralParser.kt b/src/main/kotlin/dsl/ast/parser/LiteralParser.kt new file mode 100644 index 0000000..ede847d --- /dev/null +++ b/src/main/kotlin/dsl/ast/parser/LiteralParser.kt @@ -0,0 +1,16 @@ +package dsl.ast.parser + +import dsl.ast.model.entity.ParserOutput +import dsl.token.model.entity.TokenList + +class LiteralParser : Parser() { + override fun tryToParse(input: TokenList): ParserOutput { + return oneOf(listOf( + BoolLiteralParser(), + FloatLiteralParser(), + IntegerLiteralParser(), + NoteLiteralParser(), + StringLiteralParser() + )).parse(input) + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/parser/MapEntryParser.kt b/src/main/kotlin/dsl/ast/parser/MapEntryParser.kt new file mode 100644 index 0000000..93e2c9f --- /dev/null +++ b/src/main/kotlin/dsl/ast/parser/MapEntryParser.kt @@ -0,0 +1,23 @@ +package dsl.ast.parser + +import dsl.ast.model.entity.ParserOutput +import dsl.ast.model.node.MapEntryNode +import dsl.token.model.entity.TokenList +import dsl.token.model.enumeration.TokenType + +class MapEntryParser : Parser() { + override fun tryToParse(input: TokenList): ParserOutput { + val keyParser = oneOf(listOf( + LiteralParser(), + IdentifierParser() + )) + + return allOf(listOf( + keyParser, + terminal(TokenType.ARROW), + assert(ExpressionParser(), "expression") + )) { + MapEntryNode(it[0], it[1], it[2]) + }.parse(input) + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/parser/MapParser.kt b/src/main/kotlin/dsl/ast/parser/MapParser.kt new file mode 100644 index 0000000..feeca54 --- /dev/null +++ b/src/main/kotlin/dsl/ast/parser/MapParser.kt @@ -0,0 +1,8 @@ +package dsl.ast.parser + +import dsl.ast.model.node.MapNode +import dsl.token.model.enumeration.TokenType + +class MapParser : AbstractIterableParser(TokenType.OPEN_CURLY, MapEntryParser(), TokenType.CLOSE_CURLY, { + list, tokenPosition -> MapNode(list, tokenPosition) +}) \ No newline at end of file