From 6c4f39708bfa0c1d8d9afab299ef538c6183204e Mon Sep 17 00:00:00 2001 From: Uko Kokņevičs Date: Sun, 18 Aug 2024 23:56:26 +0800 Subject: Changed the grammar to allow bare top-level expressions only in REPL. --- .../src/main/java/lv/enes/orang/parser/Parser.java | 27 ++++++++++++++++------ 1 file changed, 20 insertions(+), 7 deletions(-) (limited to 'parser/src/main/java/lv') 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 { return parser.parseProgram(); } - public static Program parseProgram(String in) throws ParserException { + public static Program parseReplProgram(String in) throws ParserException { var parser = new Parser(in); - return parser.parseProgram(); + return parser.parseReplProgram(); } private final PeekableStream input; @@ -59,6 +59,15 @@ public class Parser { return new Program(Collections.unmodifiableList(statements)); } + public Program parseReplProgram() throws ParserException { + var statements = new ArrayList(); + while (!maybeConsumeToken(Token.Type.EOF)) { + statements.add(parseReplLine()); + maybeConsumeToken(Token.Type.SEMICOLON); + } + return new Program(Collections.unmodifiableList(statements)); + } + private static boolean isNotBinaryOp(Token token) { return switch (token.type()) { case ASTERISK, SLASH, PLUS, MINUS, QUESTION_EQUAL, SLASH_EQUAL, GREATER, GREATER_EQUAL, LESS, LESS_EQUAL @@ -275,6 +284,14 @@ public class Parser { return new LetInExpression(Collections.unmodifiableList(bindings), body); } + private Statement parseReplLine() throws ParserException { + if (input.peek().type() == Token.Type.DEF) { + return parseStatement(); + } else { + return new ExpressionStatement(parseExpression()); + } + } + private Expression parseSimpleExpression() throws ParserException { return switch (input.peek().type()) { case PAREN_LEFT -> { @@ -307,11 +324,7 @@ public class Parser { } private Statement parseStatement() throws ParserException { - if (input.peek().type() == Token.Type.DEF) { - return parseDefinition(); - } else { - return new ExpressionStatement(parseExpression()); - } + return parseDefinition(); } private Expression parseString() throws ParserException { -- cgit v1.2.3