diff --git a/src/main/kotlin/SMNP.kt b/src/main/kotlin/SMNP.kt index 9b1a9e0..2d4204d 100644 --- a/src/main/kotlin/SMNP.kt +++ b/src/main/kotlin/SMNP.kt @@ -2,5 +2,5 @@ import interpreter.Interpreter fun main(args: Array) { 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 }") } \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/ConditionNode.kt b/src/main/kotlin/dsl/ast/model/node/ConditionNode.kt new file mode 100644 index 0000000..cf08bb0 --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/ConditionNode.kt @@ -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 + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/parser/ConditionParser.kt b/src/main/kotlin/dsl/ast/parser/ConditionParser.kt new file mode 100644 index 0000000..f8873d9 --- /dev/null +++ b/src/main/kotlin/dsl/ast/parser/ConditionParser.kt @@ -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) + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/parser/StatementParser.kt b/src/main/kotlin/dsl/ast/parser/StatementParser.kt index 2d2e436..0db02eb 100644 --- a/src/main/kotlin/dsl/ast/parser/StatementParser.kt +++ b/src/main/kotlin/dsl/ast/parser/StatementParser.kt @@ -10,6 +10,7 @@ class StatementParser : Parser() { listOf( oneOf( listOf( + ConditionParser(), ExpressionParser(), BlockParser(), ReturnParser(),