From c10112bc03f243cf0b263339e22474371f39d459 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Thu, 5 Mar 2020 21:14:39 +0100 Subject: [PATCH] Migrate base statement parser --- src/main/kotlin/SMNP.kt | 2 +- .../kotlin/dsl/ast/parser/StatementParser.kt | 22 +++++++++++++++++++ src/main/kotlin/interpreter/Interpreter.kt | 8 +++++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/dsl/ast/parser/StatementParser.kt diff --git a/src/main/kotlin/SMNP.kt b/src/main/kotlin/SMNP.kt index 1af53e0..4d3b11a 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)") + interpreter.run("(2 + 2) * 2 ** 2;") } \ 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 new file mode 100644 index 0000000..e353051 --- /dev/null +++ b/src/main/kotlin/dsl/ast/parser/StatementParser.kt @@ -0,0 +1,22 @@ +package dsl.ast.parser + +import dsl.ast.model.entity.ParserOutput +import dsl.token.model.entity.TokenList +import dsl.token.model.enumeration.TokenType + +class StatementParser : Parser() { + override fun tryToParse(input: TokenList): ParserOutput { + return allOf( + listOf( + oneOf( + listOf( + ExpressionParser() + ) + ), + optional(terminal(TokenType.SEMICOLON)) + ) + ) { + it[0] + }.parse(input) + } +} \ No newline at end of file diff --git a/src/main/kotlin/interpreter/Interpreter.kt b/src/main/kotlin/interpreter/Interpreter.kt index fd6f699..b092933 100644 --- a/src/main/kotlin/interpreter/Interpreter.kt +++ b/src/main/kotlin/interpreter/Interpreter.kt @@ -1,5 +1,8 @@ package interpreter +import dsl.ast.model.node.Node +import dsl.ast.parser.Parser +import dsl.ast.parser.StatementParser import dsl.token.tokenizer.DefaultTokenizer import java.io.File @@ -8,6 +11,11 @@ class Interpreter { val tokenizer = DefaultTokenizer() val lines = code.split("\n") val tokens = tokenizer.tokenize(lines) + + val ast = Parser.repeat(StatementParser()) { nodes, pos -> object : Node(nodes, pos) {} }.parse(tokens) + + ast.node.pretty() + println(tokens) } fun run(file: File) {