Migrate condition statement parser to Kotlin
This commit is contained in:
@@ -2,5 +2,5 @@ import interpreter.Interpreter
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
val interpreter = Interpreter()
|
||||
interpreter.run("{ return 2; 2*2; { 3+3; 1*2**3.@c:14 == (2 > not false) } throw \"Hello, world\" }")
|
||||
interpreter.run("if (true) { return 2; 2*2; { 3+3; 1*2**3.@c:14 == (2 > not false) } throw \"Hello, world\" } else { false }")
|
||||
}
|
||||
18
src/main/kotlin/dsl/ast/model/node/ConditionNode.kt
Normal file
18
src/main/kotlin/dsl/ast/model/node/ConditionNode.kt
Normal file
@@ -0,0 +1,18 @@
|
||||
package dsl.ast.model.node
|
||||
|
||||
class ConditionNode(trueBranchToken: Node, condition: Node, trueBranch: Node, falseBranchToken: Node, falseBranch: Node) : Node(3, trueBranchToken.position) {
|
||||
val condition: Any
|
||||
get() = children[0]
|
||||
|
||||
val trueBranch: Any
|
||||
get() = children[1]
|
||||
|
||||
val falseBranch: Any
|
||||
get() = children[2]
|
||||
|
||||
init {
|
||||
children[0] = condition
|
||||
children[1] = trueBranch
|
||||
children[2] = falseBranch
|
||||
}
|
||||
}
|
||||
38
src/main/kotlin/dsl/ast/parser/ConditionParser.kt
Normal file
38
src/main/kotlin/dsl/ast/parser/ConditionParser.kt
Normal file
@@ -0,0 +1,38 @@
|
||||
package dsl.ast.parser
|
||||
|
||||
import dsl.ast.model.entity.ParserOutput
|
||||
import dsl.ast.model.node.ConditionNode
|
||||
import dsl.ast.model.node.Node
|
||||
import dsl.token.model.entity.TokenList
|
||||
import dsl.token.model.enumeration.TokenType
|
||||
|
||||
class ConditionParser : Parser() {
|
||||
override fun tryToParse(input: TokenList): ParserOutput {
|
||||
val ifStatementParser = allOf(listOf(
|
||||
terminal(TokenType.IF),
|
||||
terminal(TokenType.OPEN_PAREN),
|
||||
ExpressionParser(),
|
||||
terminal(TokenType.CLOSE_PAREN),
|
||||
StatementParser()
|
||||
)) {
|
||||
ConditionNode(it[0], it[2], it[4], Node.NONE, Node.NONE)
|
||||
}
|
||||
|
||||
val ifElseStatementParser = allOf(listOf(
|
||||
terminal(TokenType.IF),
|
||||
terminal(TokenType.OPEN_PAREN),
|
||||
ExpressionParser(),
|
||||
terminal(TokenType.CLOSE_PAREN),
|
||||
StatementParser(),
|
||||
terminal(TokenType.ELSE),
|
||||
StatementParser()
|
||||
)) {
|
||||
ConditionNode(it[0], it[2], it[4], it[5], it[6])
|
||||
}
|
||||
|
||||
return oneOf(listOf(
|
||||
ifElseStatementParser,
|
||||
ifStatementParser
|
||||
)).parse(input)
|
||||
}
|
||||
}
|
||||
@@ -10,6 +10,7 @@ class StatementParser : Parser() {
|
||||
listOf(
|
||||
oneOf(
|
||||
listOf(
|
||||
ConditionParser(),
|
||||
ExpressionParser(),
|
||||
BlockParser(),
|
||||
ReturnParser(),
|
||||
|
||||
Reference in New Issue
Block a user