Migrate condition statement parser to Kotlin

This commit is contained in:
2020-03-05 21:37:20 +01:00
parent 7ce0a30b25
commit 030c4e5be9
4 changed files with 58 additions and 1 deletions

View File

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

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

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

View File

@@ -10,6 +10,7 @@ class StatementParser : Parser() {
listOf(
oneOf(
listOf(
ConditionParser(),
ExpressionParser(),
BlockParser(),
ReturnParser(),