From e8d57629e342fac16235f4497f33e02490dce02c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Fri, 6 Mar 2020 18:39:19 +0100 Subject: [PATCH] Migrate function call and assignment operator parsers to Kotlin --- src/main/kotlin/SMNP.kt | 2 +- .../ast/model/node/AssignmentOperatorNode.kt | 3 +++ .../model/node/FunctionCallArgumentsNode.kt | 5 +++++ .../dsl/ast/model/node/FunctionCallNode.kt | 14 ++++++++++++++ .../dsl/ast/parser/AssignmentOperatorParser.kt | 18 ++++++++++++++++++ src/main/kotlin/dsl/ast/parser/AtomParser.kt | 2 +- .../dsl/ast/parser/ComplexIdentifierParser.kt | 14 ++++++++++++++ .../ast/parser/FunctionCallArgumentsParser.kt | 8 ++++++++ .../dsl/ast/parser/FunctionCallParser.kt | 16 ++++++++++++++++ .../dsl/ast/parser/LoopParametersParser.kt | 2 +- src/main/kotlin/dsl/ast/parser/LoopParser.kt | 2 +- .../kotlin/dsl/ast/parser/MapEntryParser.kt | 2 +- ...fierParser.kt => SimpleIdentifierParser.kt} | 2 +- 13 files changed, 84 insertions(+), 6 deletions(-) create mode 100644 src/main/kotlin/dsl/ast/model/node/AssignmentOperatorNode.kt create mode 100644 src/main/kotlin/dsl/ast/model/node/FunctionCallArgumentsNode.kt create mode 100644 src/main/kotlin/dsl/ast/model/node/FunctionCallNode.kt create mode 100644 src/main/kotlin/dsl/ast/parser/AssignmentOperatorParser.kt create mode 100644 src/main/kotlin/dsl/ast/parser/ComplexIdentifierParser.kt create mode 100644 src/main/kotlin/dsl/ast/parser/FunctionCallArgumentsParser.kt create mode 100644 src/main/kotlin/dsl/ast/parser/FunctionCallParser.kt rename src/main/kotlin/dsl/ast/parser/{IdentifierParser.kt => SimpleIdentifierParser.kt} (91%) diff --git a/src/main/kotlin/SMNP.kt b/src/main/kotlin/SMNP.kt index 31ff7b1..169d47a 100644 --- a/src/main/kotlin/SMNP.kt +++ b/src/main/kotlin/SMNP.kt @@ -2,5 +2,5 @@ import interpreter.Interpreter fun main(args: Array) { val interpreter = Interpreter() - interpreter.run("{ [2, 3, 4] as (i, j, k) ^ { x y z } % i == 2 [1, xyz, [true, { 1 -> false, 2 -> { @c -> @d, @e -> false } }, [@c], 4, \"h\"]] 2 @c @d * 3.14 }") + interpreter.run("{ a = b = c = [2, 3, 4] as (i, j, k) ^ { x y z(1, 2, c(), {a -> b() }) } % i == 2 [1, xyz, [true, { 1 -> false, 2 -> { @c -> @d, @e -> false } }, [@c], 4, \"h\"]] 2 @c @d * 3.14 }") } \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/AssignmentOperatorNode.kt b/src/main/kotlin/dsl/ast/model/node/AssignmentOperatorNode.kt new file mode 100644 index 0000000..468ec31 --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/AssignmentOperatorNode.kt @@ -0,0 +1,3 @@ +package dsl.ast.model.node + +class AssignmentOperatorNode(lhs: Node, operator: Node, rhs: Node) : BinaryOperatorAbstractNode(lhs, operator, rhs) \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/FunctionCallArgumentsNode.kt b/src/main/kotlin/dsl/ast/model/node/FunctionCallArgumentsNode.kt new file mode 100644 index 0000000..c7cd45c --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/FunctionCallArgumentsNode.kt @@ -0,0 +1,5 @@ +package dsl.ast.model.node + +import dsl.token.model.entity.TokenPosition + +class FunctionCallArgumentsNode(items: List, position: TokenPosition) : AbstractIterableNode(items, position) \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/FunctionCallNode.kt b/src/main/kotlin/dsl/ast/model/node/FunctionCallNode.kt new file mode 100644 index 0000000..25593a8 --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/FunctionCallNode.kt @@ -0,0 +1,14 @@ +package dsl.ast.model.node + +class FunctionCallNode(identifier: Node, arguments: Node) : Node(2, identifier.position) { + val identifier: Node + get() = children[0] + + val arguments: Node + get() = children[1] + + init { + children[0] = identifier + children[1] = arguments + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/parser/AssignmentOperatorParser.kt b/src/main/kotlin/dsl/ast/parser/AssignmentOperatorParser.kt new file mode 100644 index 0000000..c18c8fa --- /dev/null +++ b/src/main/kotlin/dsl/ast/parser/AssignmentOperatorParser.kt @@ -0,0 +1,18 @@ +package dsl.ast.parser + +import dsl.ast.model.entity.ParserOutput +import dsl.ast.model.node.AssignmentOperatorNode +import dsl.token.model.entity.TokenList +import dsl.token.model.enumeration.TokenType + +class AssignmentOperatorParser : Parser() { + override fun tryToParse(input: TokenList): ParserOutput { + return allOf(listOf( + SimpleIdentifierParser(), + terminal(TokenType.ASSIGN), + assert(ExpressionParser(), "expression") + )) { + AssignmentOperatorNode(it[0], it[1], it[2]) + }.parse(input) + } +} \ 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 544722f..5ef61ba 100644 --- a/src/main/kotlin/dsl/ast/parser/AtomParser.kt +++ b/src/main/kotlin/dsl/ast/parser/AtomParser.kt @@ -19,7 +19,7 @@ class AtomParser : Parser() { val literalParser = oneOf( listOf( parenthesesParser, - IdentifierParser(), + ComplexIdentifierParser(), ListParser(), LiteralParser(), MapParser() diff --git a/src/main/kotlin/dsl/ast/parser/ComplexIdentifierParser.kt b/src/main/kotlin/dsl/ast/parser/ComplexIdentifierParser.kt new file mode 100644 index 0000000..a013b67 --- /dev/null +++ b/src/main/kotlin/dsl/ast/parser/ComplexIdentifierParser.kt @@ -0,0 +1,14 @@ +package dsl.ast.parser + +import dsl.ast.model.entity.ParserOutput +import dsl.token.model.entity.TokenList + +class ComplexIdentifierParser : Parser() { + override fun tryToParse(input: TokenList): ParserOutput { + return oneOf(listOf( + AssignmentOperatorParser(), + FunctionCallParser(), + SimpleIdentifierParser() + )).parse(input) + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/parser/FunctionCallArgumentsParser.kt b/src/main/kotlin/dsl/ast/parser/FunctionCallArgumentsParser.kt new file mode 100644 index 0000000..24a736a --- /dev/null +++ b/src/main/kotlin/dsl/ast/parser/FunctionCallArgumentsParser.kt @@ -0,0 +1,8 @@ +package dsl.ast.parser + +import dsl.ast.model.node.FunctionCallArgumentsNode +import dsl.token.model.enumeration.TokenType + +class FunctionCallArgumentsParser : AbstractIterableParser(TokenType.OPEN_PAREN, ExpressionParser(), TokenType.CLOSE_PAREN, { + list, tokenPosition -> FunctionCallArgumentsNode(list, tokenPosition) +}) \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/parser/FunctionCallParser.kt b/src/main/kotlin/dsl/ast/parser/FunctionCallParser.kt new file mode 100644 index 0000000..e14a16d --- /dev/null +++ b/src/main/kotlin/dsl/ast/parser/FunctionCallParser.kt @@ -0,0 +1,16 @@ +package dsl.ast.parser + +import dsl.ast.model.entity.ParserOutput +import dsl.ast.model.node.FunctionCallNode +import dsl.token.model.entity.TokenList + +class FunctionCallParser : Parser() { + override fun tryToParse(input: TokenList): ParserOutput { + return allOf(listOf( + SimpleIdentifierParser(), + FunctionCallArgumentsParser() + )) { + FunctionCallNode(it[0], it[1]) + }.parse(input) + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/parser/LoopParametersParser.kt b/src/main/kotlin/dsl/ast/parser/LoopParametersParser.kt index d26e210..b853b00 100644 --- a/src/main/kotlin/dsl/ast/parser/LoopParametersParser.kt +++ b/src/main/kotlin/dsl/ast/parser/LoopParametersParser.kt @@ -3,6 +3,6 @@ package dsl.ast.parser import dsl.ast.model.node.LoopParametersNode import dsl.token.model.enumeration.TokenType -class LoopParametersParser : AbstractIterableParser(TokenType.OPEN_PAREN, IdentifierParser(), TokenType.CLOSE_PAREN, { +class LoopParametersParser : AbstractIterableParser(TokenType.OPEN_PAREN, SimpleIdentifierParser(), TokenType.CLOSE_PAREN, { list, tokenPosition -> LoopParametersNode(list, tokenPosition) }) \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/parser/LoopParser.kt b/src/main/kotlin/dsl/ast/parser/LoopParser.kt index e6a3ecc..3aefd7d 100644 --- a/src/main/kotlin/dsl/ast/parser/LoopParser.kt +++ b/src/main/kotlin/dsl/ast/parser/LoopParser.kt @@ -11,7 +11,7 @@ class LoopParser : Parser() { val loopParametersParser = allOf(listOf( terminal(TokenType.AS), oneOf(listOf( - mapNode(IdentifierParser()) { LoopParametersNode(listOf(it), it.position) }, + mapNode(SimpleIdentifierParser()) { LoopParametersNode(listOf(it), it.position) }, LoopParametersParser() )) )) { it[1] } diff --git a/src/main/kotlin/dsl/ast/parser/MapEntryParser.kt b/src/main/kotlin/dsl/ast/parser/MapEntryParser.kt index 01b52f0..0ec1bce 100644 --- a/src/main/kotlin/dsl/ast/parser/MapEntryParser.kt +++ b/src/main/kotlin/dsl/ast/parser/MapEntryParser.kt @@ -9,7 +9,7 @@ class MapEntryParser : Parser() { override fun tryToParse(input: TokenList): ParserOutput { val keyParser = oneOf(listOf( LiteralParser(), - IdentifierParser() + SimpleIdentifierParser() )) return allOf(listOf( diff --git a/src/main/kotlin/dsl/ast/parser/IdentifierParser.kt b/src/main/kotlin/dsl/ast/parser/SimpleIdentifierParser.kt similarity index 91% rename from src/main/kotlin/dsl/ast/parser/IdentifierParser.kt rename to src/main/kotlin/dsl/ast/parser/SimpleIdentifierParser.kt index 03c446c..c5edb2a 100644 --- a/src/main/kotlin/dsl/ast/parser/IdentifierParser.kt +++ b/src/main/kotlin/dsl/ast/parser/SimpleIdentifierParser.kt @@ -5,7 +5,7 @@ import dsl.ast.model.node.IdentifierNode import dsl.token.model.entity.TokenList import dsl.token.model.enumeration.TokenType -class IdentifierParser : Parser() { +class SimpleIdentifierParser : Parser() { override fun tryToParse(input: TokenList): ParserOutput { val identifierParser = terminal(TokenType.IDENTIFIER) { IdentifierNode(it) }