Migrate base literal parsers

This commit is contained in:
2020-03-05 20:21:53 +01:00
parent 4868528e3a
commit f64b98e0d6
14 changed files with 100 additions and 30 deletions

View File

@@ -2,4 +2,5 @@ import interpreter.Interpreter
fun main(args: Array<String>) {
val interpreter = Interpreter()
interpreter.run("true 123 \"fsfsef\" @c:14 3.14")
}

View File

@@ -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
}
}

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View 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)
}
}

View 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)
}
}

View 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)
}
}

View 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)
}
}

View 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)
}
}

View File

@@ -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()
}

View 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)
}
}