From f64b98e0d6407583f40dec5b2d04be6b8e4a308f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Thu, 5 Mar 2020 20:21:53 +0100 Subject: [PATCH] Migrate base literal parsers --- src/main/kotlin/SMNP.kt | 1 + .../dsl/ast/model/node/AtomAbstractNode.kt | 8 +++++-- .../dsl/ast/model/node/BoolLiteralNode.kt | 4 ++-- .../dsl/ast/model/node/FloatLiteralNode.kt | 4 ++-- .../dsl/ast/model/node/IntegerLiteralNode.kt | 4 ++-- .../dsl/ast/model/node/NoteLiteralNode.kt | 4 ++-- .../dsl/ast/model/node/StringLiteralNode.kt | 4 ++-- src/main/kotlin/dsl/ast/parser/AtomParser.kt | 20 ++++++++++++++++++ .../dsl/ast/parser/BoolLiteralParser.kt | 12 +++++++++++ .../dsl/ast/parser/FloatLiteralParser.kt | 12 +++++++++++ .../dsl/ast/parser/IntegerLiteralParser.kt | 12 +++++++++++ .../dsl/ast/parser/NoteLiteralParser.kt | 12 +++++++++++ src/main/kotlin/dsl/ast/parser/Parser.kt | 21 +++---------------- .../dsl/ast/parser/StringLiteralParser.kt | 12 +++++++++++ 14 files changed, 100 insertions(+), 30 deletions(-) create mode 100644 src/main/kotlin/dsl/ast/parser/AtomParser.kt create mode 100644 src/main/kotlin/dsl/ast/parser/BoolLiteralParser.kt create mode 100644 src/main/kotlin/dsl/ast/parser/FloatLiteralParser.kt create mode 100644 src/main/kotlin/dsl/ast/parser/IntegerLiteralParser.kt create mode 100644 src/main/kotlin/dsl/ast/parser/NoteLiteralParser.kt create mode 100644 src/main/kotlin/dsl/ast/parser/StringLiteralParser.kt diff --git a/src/main/kotlin/SMNP.kt b/src/main/kotlin/SMNP.kt index c5a5983..b43e3ec 100644 --- a/src/main/kotlin/SMNP.kt +++ b/src/main/kotlin/SMNP.kt @@ -2,4 +2,5 @@ import interpreter.Interpreter fun main(args: Array) { val interpreter = Interpreter() + interpreter.run("true 123 \"fsfsef\" @c:14 3.14") } \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/AtomAbstractNode.kt b/src/main/kotlin/dsl/ast/model/node/AtomAbstractNode.kt index b94a8b7..aced23c 100644 --- a/src/main/kotlin/dsl/ast/model/node/AtomAbstractNode.kt +++ b/src/main/kotlin/dsl/ast/model/node/AtomAbstractNode.kt @@ -1,12 +1,16 @@ package dsl.ast.model.node -import dsl.token.model.entity.TokenPosition +import dsl.token.model.entity.Token -abstract class AtomAbstractNode(position: TokenPosition) : Node(1, position) { +abstract class AtomAbstractNode(token: Token) : Node(1, token.position) { var value: Any get() = children[0] set(value) { children[0] = value } + + init { + value = token.value + } } diff --git a/src/main/kotlin/dsl/ast/model/node/BoolLiteralNode.kt b/src/main/kotlin/dsl/ast/model/node/BoolLiteralNode.kt index aa06e1c..95babd2 100644 --- a/src/main/kotlin/dsl/ast/model/node/BoolLiteralNode.kt +++ b/src/main/kotlin/dsl/ast/model/node/BoolLiteralNode.kt @@ -1,5 +1,5 @@ package dsl.ast.model.node -import dsl.token.model.entity.TokenPosition +import dsl.token.model.entity.Token -class BoolLiteralNode(position: TokenPosition) : AtomAbstractNode(position) \ No newline at end of file +class BoolLiteralNode(token: Token) : AtomAbstractNode(token) \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/FloatLiteralNode.kt b/src/main/kotlin/dsl/ast/model/node/FloatLiteralNode.kt index 545585f..82bb965 100644 --- a/src/main/kotlin/dsl/ast/model/node/FloatLiteralNode.kt +++ b/src/main/kotlin/dsl/ast/model/node/FloatLiteralNode.kt @@ -1,5 +1,5 @@ package dsl.ast.model.node -import dsl.token.model.entity.TokenPosition +import dsl.token.model.entity.Token -class FloatLiteralNode(position: TokenPosition) : AtomAbstractNode(position) \ No newline at end of file +class FloatLiteralNode(token: Token) : AtomAbstractNode(token) \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/IntegerLiteralNode.kt b/src/main/kotlin/dsl/ast/model/node/IntegerLiteralNode.kt index cfcb27c..804b77f 100644 --- a/src/main/kotlin/dsl/ast/model/node/IntegerLiteralNode.kt +++ b/src/main/kotlin/dsl/ast/model/node/IntegerLiteralNode.kt @@ -1,5 +1,5 @@ package dsl.ast.model.node -import dsl.token.model.entity.TokenPosition +import dsl.token.model.entity.Token -class IntegerLiteralNode(position: TokenPosition) : AtomAbstractNode(position) \ No newline at end of file +class IntegerLiteralNode(token: Token) : AtomAbstractNode(token) \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/NoteLiteralNode.kt b/src/main/kotlin/dsl/ast/model/node/NoteLiteralNode.kt index d987904..3d7abf2 100644 --- a/src/main/kotlin/dsl/ast/model/node/NoteLiteralNode.kt +++ b/src/main/kotlin/dsl/ast/model/node/NoteLiteralNode.kt @@ -1,5 +1,5 @@ package dsl.ast.model.node -import dsl.token.model.entity.TokenPosition +import dsl.token.model.entity.Token -class NoteLiteralNode(position: TokenPosition) : AtomAbstractNode(position) \ No newline at end of file +class NoteLiteralNode(token: Token) : AtomAbstractNode(token) \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/StringLiteralNode.kt b/src/main/kotlin/dsl/ast/model/node/StringLiteralNode.kt index 39b3d5b..d5d62f4 100644 --- a/src/main/kotlin/dsl/ast/model/node/StringLiteralNode.kt +++ b/src/main/kotlin/dsl/ast/model/node/StringLiteralNode.kt @@ -1,5 +1,5 @@ package dsl.ast.model.node -import dsl.token.model.entity.TokenPosition +import dsl.token.model.entity.Token -class StringLiteralNode(position: TokenPosition) : AtomAbstractNode(position) \ No newline at end of file +class StringLiteralNode(token: Token) : AtomAbstractNode(token) \ 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 new file mode 100644 index 0000000..b231c50 --- /dev/null +++ b/src/main/kotlin/dsl/ast/parser/AtomParser.kt @@ -0,0 +1,20 @@ +package dsl.ast.parser + +import dsl.ast.model.entity.ParserOutput +import dsl.token.model.entity.TokenList + +class AtomParser : Parser() { + override fun tryToParse(input: TokenList): ParserOutput { + val literalParser = oneOf( + listOf( + BoolLiteralParser(), + FloatLiteralParser(), + IntegerLiteralParser(), + NoteLiteralParser(), + StringLiteralParser() + ) + ) + + return literalParser.parse(input) + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/parser/BoolLiteralParser.kt b/src/main/kotlin/dsl/ast/parser/BoolLiteralParser.kt new file mode 100644 index 0000000..646eb27 --- /dev/null +++ b/src/main/kotlin/dsl/ast/parser/BoolLiteralParser.kt @@ -0,0 +1,12 @@ +package dsl.ast.parser + +import dsl.ast.model.entity.ParserOutput +import dsl.ast.model.node.BoolLiteralNode +import dsl.token.model.entity.TokenList +import dsl.token.model.enumeration.TokenType + +class BoolLiteralParser : Parser() { + override fun tryToParse(input: TokenList): ParserOutput { + return terminal(TokenType.BOOL) { BoolLiteralNode(it) }.parse(input) + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/parser/FloatLiteralParser.kt b/src/main/kotlin/dsl/ast/parser/FloatLiteralParser.kt new file mode 100644 index 0000000..f0026cf --- /dev/null +++ b/src/main/kotlin/dsl/ast/parser/FloatLiteralParser.kt @@ -0,0 +1,12 @@ +package dsl.ast.parser + +import dsl.ast.model.entity.ParserOutput +import dsl.ast.model.node.FloatLiteralNode +import dsl.token.model.entity.TokenList +import dsl.token.model.enumeration.TokenType + +class FloatLiteralParser : Parser() { + override fun tryToParse(input: TokenList): ParserOutput { + return terminal(TokenType.FLOAT) { FloatLiteralNode(it) }.parse(input) + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/parser/IntegerLiteralParser.kt b/src/main/kotlin/dsl/ast/parser/IntegerLiteralParser.kt new file mode 100644 index 0000000..227d76a --- /dev/null +++ b/src/main/kotlin/dsl/ast/parser/IntegerLiteralParser.kt @@ -0,0 +1,12 @@ +package dsl.ast.parser + +import dsl.ast.model.entity.ParserOutput +import dsl.ast.model.node.IntegerLiteralNode +import dsl.token.model.entity.TokenList +import dsl.token.model.enumeration.TokenType + +class IntegerLiteralParser : Parser() { + override fun tryToParse(input: TokenList): ParserOutput { + return terminal(TokenType.INTEGER) { IntegerLiteralNode(it) }.parse(input) + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/parser/NoteLiteralParser.kt b/src/main/kotlin/dsl/ast/parser/NoteLiteralParser.kt new file mode 100644 index 0000000..b958398 --- /dev/null +++ b/src/main/kotlin/dsl/ast/parser/NoteLiteralParser.kt @@ -0,0 +1,12 @@ +package dsl.ast.parser + +import dsl.ast.model.entity.ParserOutput +import dsl.ast.model.node.NoteLiteralNode +import dsl.token.model.entity.TokenList +import dsl.token.model.enumeration.TokenType + +class NoteLiteralParser : Parser() { + override fun tryToParse(input: TokenList): ParserOutput { + return terminal(TokenType.NOTE) { NoteLiteralNode(it) }.parse(input) + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/parser/Parser.kt b/src/main/kotlin/dsl/ast/parser/Parser.kt index f391348..6501090 100644 --- a/src/main/kotlin/dsl/ast/parser/Parser.kt +++ b/src/main/kotlin/dsl/ast/parser/Parser.kt @@ -25,7 +25,7 @@ abstract class Parser { companion object { // a -> A - fun terminal(terminal: TokenType, createNode: (Token) -> Node = { TokenNode(it) }, assert: Boolean = false): Parser { + fun terminal(terminal: TokenType, createNode: (Token) -> Node = { TokenNode(it) }): Parser { return object : Parser() { override fun tryToParse(input: TokenList): ParserOutput { if(input.hasCurrent() && input.current.type == terminal) { @@ -33,9 +33,6 @@ abstract class Parser { input.ahead() return ParserOutput.ok(createNode(token)) } - else if(assert) { - throw RuntimeException("Expected $terminal") - } return ParserOutput.fail() } @@ -43,7 +40,7 @@ abstract class Parser { } // oneOf -> a | b | c | ... - fun oneOf(parsers: List, expectedString: String? = null, exceptionSupplier: ((TokenList) -> Exception)? = null): Parser { + fun oneOf(parsers: List): Parser { return object : Parser() { override fun tryToParse(input: TokenList): ParserOutput { if(parsers.isEmpty()) { @@ -57,14 +54,6 @@ abstract class Parser { } } - if (expectedString != null) { - throw RuntimeException("Expected $expectedString") - } - - if (exceptionSupplier != null) { - throw exceptionSupplier(input) - } - return ParserOutput.fail() } } @@ -76,7 +65,7 @@ abstract class Parser { } // allOf -> a b c ... - fun allOf(parsers: List, createNode: (List, TokenPosition) -> Node, exceptionSupplier: ((TokenList) -> Exception)? = null): Parser { + fun allOf(parsers: List, createNode: (List, TokenPosition) -> Node): Parser { return object : Parser() { override fun tryToParse(input: TokenList): ParserOutput { if(parsers.isEmpty()) { @@ -89,10 +78,6 @@ abstract class Parser { val output = parser.parse(input) if (output.result == ParsingResult.FAILED) { - if (exceptionSupplier != null) { - throw exceptionSupplier(input) - } - return ParserOutput.fail() } diff --git a/src/main/kotlin/dsl/ast/parser/StringLiteralParser.kt b/src/main/kotlin/dsl/ast/parser/StringLiteralParser.kt new file mode 100644 index 0000000..8a19106 --- /dev/null +++ b/src/main/kotlin/dsl/ast/parser/StringLiteralParser.kt @@ -0,0 +1,12 @@ +package dsl.ast.parser + +import dsl.ast.model.entity.ParserOutput +import dsl.ast.model.node.StringLiteralNode +import dsl.token.model.entity.TokenList +import dsl.token.model.enumeration.TokenType + +class StringLiteralParser : Parser() { + override fun tryToParse(input: TokenList): ParserOutput { + return terminal(TokenType.STRING) { StringLiteralNode(it) }.parse(input) + } +} \ No newline at end of file