Migrate base literal parsers
This commit is contained in:
@@ -2,4 +2,5 @@ import interpreter.Interpreter
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
val interpreter = Interpreter()
|
||||
interpreter.run("true 123 \"fsfsef\" @c:14 3.14")
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
class BoolLiteralNode(token: Token) : AtomAbstractNode(token)
|
||||
@@ -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)
|
||||
class FloatLiteralNode(token: Token) : AtomAbstractNode(token)
|
||||
@@ -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)
|
||||
class IntegerLiteralNode(token: Token) : AtomAbstractNode(token)
|
||||
@@ -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)
|
||||
class NoteLiteralNode(token: Token) : AtomAbstractNode(token)
|
||||
@@ -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)
|
||||
class StringLiteralNode(token: Token) : AtomAbstractNode(token)
|
||||
20
src/main/kotlin/dsl/ast/parser/AtomParser.kt
Normal file
20
src/main/kotlin/dsl/ast/parser/AtomParser.kt
Normal file
@@ -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)
|
||||
}
|
||||
}
|
||||
12
src/main/kotlin/dsl/ast/parser/BoolLiteralParser.kt
Normal file
12
src/main/kotlin/dsl/ast/parser/BoolLiteralParser.kt
Normal file
@@ -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)
|
||||
}
|
||||
}
|
||||
12
src/main/kotlin/dsl/ast/parser/FloatLiteralParser.kt
Normal file
12
src/main/kotlin/dsl/ast/parser/FloatLiteralParser.kt
Normal file
@@ -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)
|
||||
}
|
||||
}
|
||||
12
src/main/kotlin/dsl/ast/parser/IntegerLiteralParser.kt
Normal file
12
src/main/kotlin/dsl/ast/parser/IntegerLiteralParser.kt
Normal file
@@ -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)
|
||||
}
|
||||
}
|
||||
12
src/main/kotlin/dsl/ast/parser/NoteLiteralParser.kt
Normal file
12
src/main/kotlin/dsl/ast/parser/NoteLiteralParser.kt
Normal file
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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<Parser>, expectedString: String? = null, exceptionSupplier: ((TokenList) -> Exception)? = null): Parser {
|
||||
fun oneOf(parsers: List<Parser>): 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<Parser>, createNode: (List<Node>, TokenPosition) -> Node, exceptionSupplier: ((TokenList) -> Exception)? = null): Parser {
|
||||
fun allOf(parsers: List<Parser>, createNode: (List<Node>, 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()
|
||||
}
|
||||
|
||||
|
||||
12
src/main/kotlin/dsl/ast/parser/StringLiteralParser.kt
Normal file
12
src/main/kotlin/dsl/ast/parser/StringLiteralParser.kt
Normal file
@@ -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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user