summaryrefslogtreecommitdiff
path: root/parser
diff options
context:
space:
mode:
authorGravatar Uko Kokņevičs2024-08-18 23:56:26 +0800
committerGravatar Uko Kokņevičs2024-08-18 23:56:26 +0800
commit6c4f39708bfa0c1d8d9afab299ef538c6183204e (patch)
tree99a5cc77241acd43e8762e1520cb1af585574041 /parser
parentAdded explicit ignored/"underscore" arguments & top-level defs (diff)
downloadorang-6c4f39708bfa0c1d8d9afab299ef538c6183204e.tar.gz
orang-6c4f39708bfa0c1d8d9afab299ef538c6183204e.tar.xz
orang-6c4f39708bfa0c1d8d9afab299ef538c6183204e.zip
Changed the grammar to allow bare top-level expressions only in REPL.
Diffstat (limited to 'parser')
-rw-r--r--parser/src/main/java/lv/enes/orang/parser/Parser.java27
1 files changed, 20 insertions, 7 deletions
diff --git a/parser/src/main/java/lv/enes/orang/parser/Parser.java b/parser/src/main/java/lv/enes/orang/parser/Parser.java
index 3a2e931..9103123 100644
--- a/parser/src/main/java/lv/enes/orang/parser/Parser.java
+++ b/parser/src/main/java/lv/enes/orang/parser/Parser.java
@@ -27,9 +27,9 @@ public class Parser {
27 return parser.parseProgram(); 27 return parser.parseProgram();
28 } 28 }
29 29
30 public static Program parseProgram(String in) throws ParserException { 30 public static Program parseReplProgram(String in) throws ParserException {
31 var parser = new Parser(in); 31 var parser = new Parser(in);
32 return parser.parseProgram(); 32 return parser.parseReplProgram();
33 } 33 }
34 34
35 private final PeekableStream<Token> input; 35 private final PeekableStream<Token> input;
@@ -59,6 +59,15 @@ public class Parser {
59 return new Program(Collections.unmodifiableList(statements)); 59 return new Program(Collections.unmodifiableList(statements));
60 } 60 }
61 61
62 public Program parseReplProgram() throws ParserException {
63 var statements = new ArrayList<Statement>();
64 while (!maybeConsumeToken(Token.Type.EOF)) {
65 statements.add(parseReplLine());
66 maybeConsumeToken(Token.Type.SEMICOLON);
67 }
68 return new Program(Collections.unmodifiableList(statements));
69 }
70
62 private static boolean isNotBinaryOp(Token token) { 71 private static boolean isNotBinaryOp(Token token) {
63 return switch (token.type()) { 72 return switch (token.type()) {
64 case ASTERISK, SLASH, PLUS, MINUS, QUESTION_EQUAL, SLASH_EQUAL, GREATER, GREATER_EQUAL, LESS, LESS_EQUAL 73 case ASTERISK, SLASH, PLUS, MINUS, QUESTION_EQUAL, SLASH_EQUAL, GREATER, GREATER_EQUAL, LESS, LESS_EQUAL
@@ -275,6 +284,14 @@ public class Parser {
275 return new LetInExpression(Collections.unmodifiableList(bindings), body); 284 return new LetInExpression(Collections.unmodifiableList(bindings), body);
276 } 285 }
277 286
287 private Statement parseReplLine() throws ParserException {
288 if (input.peek().type() == Token.Type.DEF) {
289 return parseStatement();
290 } else {
291 return new ExpressionStatement(parseExpression());
292 }
293 }
294
278 private Expression parseSimpleExpression() throws ParserException { 295 private Expression parseSimpleExpression() throws ParserException {
279 return switch (input.peek().type()) { 296 return switch (input.peek().type()) {
280 case PAREN_LEFT -> { 297 case PAREN_LEFT -> {
@@ -307,11 +324,7 @@ public class Parser {
307 } 324 }
308 325
309 private Statement parseStatement() throws ParserException { 326 private Statement parseStatement() throws ParserException {
310 if (input.peek().type() == Token.Type.DEF) { 327 return parseDefinition();
311 return parseDefinition();
312 } else {
313 return new ExpressionStatement(parseExpression());
314 }
315 } 328 }
316 329
317 private Expression parseString() throws ParserException { 330 private Expression parseString() throws ParserException {