Migrate some additional statement parsers

This commit is contained in:
2020-03-05 21:27:08 +01:00
parent c10112bc03
commit 7ce0a30b25
9 changed files with 88 additions and 3 deletions

View File

@@ -2,5 +2,5 @@ import interpreter.Interpreter
fun main(args: Array<String>) {
val interpreter = Interpreter()
interpreter.run("(2 + 2) * 2 ** 2;")
interpreter.run("{ return 2; 2*2; { 3+3; 1*2**3.@c:14 == (2 > not false) } throw \"Hello, world\" }")
}

View File

@@ -0,0 +1,10 @@
package dsl.ast.model.node
class BlockNode(begin: Node, statements: List<Node>, end: Node) : Node(statements, begin.position) {
val statements: List<Any>
get() = children
init {
children = statements.toMutableList()
}
}

View File

@@ -0,0 +1,10 @@
package dsl.ast.model.node
class ReturnNode(value: Node) : Node(1, value.position) {
val value: Any
get() = children[0]
init {
children[0] = value
}
}

View File

@@ -0,0 +1,10 @@
package dsl.ast.model.node
class ThrowNode(value: Node) : Node(1, value.position) {
val value: Any
get() = children[0]
init {
children[0] = value
}
}

View File

@@ -0,0 +1,18 @@
package dsl.ast.parser
import dsl.ast.model.entity.ParserOutput
import dsl.ast.model.node.BlockNode
import dsl.token.model.entity.TokenList
import dsl.token.model.enumeration.TokenType
class BlockParser : Parser() {
override fun tryToParse(input: TokenList): ParserOutput {
return loop(
terminal(TokenType.OPEN_CURLY),
assert(StatementParser(), "statement or }"),
terminal(TokenType.CLOSE_CURLY)
) { begin, list, end ->
BlockNode(begin, list, end)
}.parse(input)
}
}

View File

@@ -0,0 +1,17 @@
package dsl.ast.parser
import dsl.ast.model.entity.ParserOutput
import dsl.ast.model.node.ReturnNode
import dsl.token.model.entity.TokenList
import dsl.token.model.enumeration.TokenType
class ReturnParser : Parser() {
override fun tryToParse(input: TokenList): ParserOutput {
return allOf(listOf(
terminal(TokenType.RETURN),
optional(ExpressionParser())
)) {
ReturnNode(it[1])
}.parse(input)
}
}

View File

@@ -10,7 +10,10 @@ class StatementParser : Parser() {
listOf(
oneOf(
listOf(
ExpressionParser()
ExpressionParser(),
BlockParser(),
ReturnParser(),
ThrowParser()
)
),
optional(terminal(TokenType.SEMICOLON))

View File

@@ -0,0 +1,17 @@
package dsl.ast.parser
import dsl.ast.model.entity.ParserOutput
import dsl.ast.model.node.ThrowNode
import dsl.token.model.entity.TokenList
import dsl.token.model.enumeration.TokenType
class ThrowParser : Parser() {
override fun tryToParse(input: TokenList): ParserOutput {
return allOf(listOf(
terminal(TokenType.THROW),
optional(ExpressionParser())
)) {
ThrowNode(it[1])
}.parse(input)
}
}

View File

@@ -10,6 +10,6 @@ data class TokenPosition(val line: Int, val beginCol: Int, val endCol: Int) {
}
fun short(): String {
return "${line+1}:${beginCol}}"
return "${line+1}:${beginCol}"
}
}