Migrate some additional statement parsers
This commit is contained in:
@@ -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\" }")
|
||||
}
|
||||
10
src/main/kotlin/dsl/ast/model/node/BlockNode.kt
Normal file
10
src/main/kotlin/dsl/ast/model/node/BlockNode.kt
Normal 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()
|
||||
}
|
||||
}
|
||||
10
src/main/kotlin/dsl/ast/model/node/ReturnNode.kt
Normal file
10
src/main/kotlin/dsl/ast/model/node/ReturnNode.kt
Normal 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
|
||||
}
|
||||
}
|
||||
10
src/main/kotlin/dsl/ast/model/node/ThrowNode.kt
Normal file
10
src/main/kotlin/dsl/ast/model/node/ThrowNode.kt
Normal 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
|
||||
}
|
||||
}
|
||||
18
src/main/kotlin/dsl/ast/parser/BlockParser.kt
Normal file
18
src/main/kotlin/dsl/ast/parser/BlockParser.kt
Normal 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)
|
||||
}
|
||||
}
|
||||
17
src/main/kotlin/dsl/ast/parser/ReturnParser.kt
Normal file
17
src/main/kotlin/dsl/ast/parser/ReturnParser.kt
Normal 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)
|
||||
}
|
||||
}
|
||||
@@ -10,7 +10,10 @@ class StatementParser : Parser() {
|
||||
listOf(
|
||||
oneOf(
|
||||
listOf(
|
||||
ExpressionParser()
|
||||
ExpressionParser(),
|
||||
BlockParser(),
|
||||
ReturnParser(),
|
||||
ThrowParser()
|
||||
)
|
||||
),
|
||||
optional(terminal(TokenType.SEMICOLON))
|
||||
|
||||
17
src/main/kotlin/dsl/ast/parser/ThrowParser.kt
Normal file
17
src/main/kotlin/dsl/ast/parser/ThrowParser.kt
Normal 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)
|
||||
}
|
||||
}
|
||||
@@ -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}"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user