diff --git a/src/main/kotlin/SMNP.kt b/src/main/kotlin/SMNP.kt index 4d3b11a..9b1a9e0 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("(2 + 2) * 2 ** 2;") + interpreter.run("{ return 2; 2*2; { 3+3; 1*2**3.@c:14 == (2 > not false) } throw \"Hello, world\" }") } \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/BlockNode.kt b/src/main/kotlin/dsl/ast/model/node/BlockNode.kt new file mode 100644 index 0000000..6cb4ffd --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/BlockNode.kt @@ -0,0 +1,10 @@ +package dsl.ast.model.node + +class BlockNode(begin: Node, statements: List, end: Node) : Node(statements, begin.position) { + val statements: List + get() = children + + init { + children = statements.toMutableList() + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/ReturnNode.kt b/src/main/kotlin/dsl/ast/model/node/ReturnNode.kt new file mode 100644 index 0000000..9ed9b06 --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/ReturnNode.kt @@ -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 + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/model/node/ThrowNode.kt b/src/main/kotlin/dsl/ast/model/node/ThrowNode.kt new file mode 100644 index 0000000..6ebce01 --- /dev/null +++ b/src/main/kotlin/dsl/ast/model/node/ThrowNode.kt @@ -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 + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/parser/BlockParser.kt b/src/main/kotlin/dsl/ast/parser/BlockParser.kt new file mode 100644 index 0000000..43d7509 --- /dev/null +++ b/src/main/kotlin/dsl/ast/parser/BlockParser.kt @@ -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) + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/ast/parser/ReturnParser.kt b/src/main/kotlin/dsl/ast/parser/ReturnParser.kt new file mode 100644 index 0000000..05420a0 --- /dev/null +++ b/src/main/kotlin/dsl/ast/parser/ReturnParser.kt @@ -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) + } +} \ 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 e353051..2d2e436 100644 --- a/src/main/kotlin/dsl/ast/parser/StatementParser.kt +++ b/src/main/kotlin/dsl/ast/parser/StatementParser.kt @@ -10,7 +10,10 @@ class StatementParser : Parser() { listOf( oneOf( listOf( - ExpressionParser() + ExpressionParser(), + BlockParser(), + ReturnParser(), + ThrowParser() ) ), optional(terminal(TokenType.SEMICOLON)) diff --git a/src/main/kotlin/dsl/ast/parser/ThrowParser.kt b/src/main/kotlin/dsl/ast/parser/ThrowParser.kt new file mode 100644 index 0000000..766e4e9 --- /dev/null +++ b/src/main/kotlin/dsl/ast/parser/ThrowParser.kt @@ -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) + } +} \ No newline at end of file diff --git a/src/main/kotlin/dsl/token/model/entity/TokenPosition.kt b/src/main/kotlin/dsl/token/model/entity/TokenPosition.kt index 7e5a5b5..68f5d7c 100644 --- a/src/main/kotlin/dsl/token/model/entity/TokenPosition.kt +++ b/src/main/kotlin/dsl/token/model/entity/TokenPosition.kt @@ -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}" } } \ No newline at end of file