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. --- grammar.bnf | 5 +++- orang/src/main/java/lv/enes/orang/Main.java | 4 ++-- .../src/main/java/lv/enes/orang/parser/Parser.java | 27 ++++++++++++++++------ 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/grammar.bnf b/grammar.bnf index 0ac58f9..a9e21cb 100644 --- a/grammar.bnf +++ b/grammar.bnf @@ -1,7 +1,7 @@ // Comments are introduced by # and terminated by newline program ::= (statement ';'?)*; -statement ::= definition | expression; +statement ::= definition; definition ::= 'def' def-spec '=' expression | 'def' '_' '=' expression; def-spec ::= IDENTIFIER arg-spec*; @@ -31,3 +31,6 @@ let-in-expression ::= 'let' def-spec '=' expression ('and' def-spec '=' expressi fn-expression ::= 'fn' arg-spec+ '->' expression | 'fn' arg-spec+ do-expression; do-expression ::= 'do' expression (';' expression)* 'end'; + +repl-program ::= (repl-statement ';'?)* '\n'; // currently, hard-limited by the newline :sweat_smile: +repl-statement ::= statement | expression; \ No newline at end of file diff --git a/orang/src/main/java/lv/enes/orang/Main.java b/orang/src/main/java/lv/enes/orang/Main.java index eb4bfcc..7175dac 100644 --- a/orang/src/main/java/lv/enes/orang/Main.java +++ b/orang/src/main/java/lv/enes/orang/Main.java @@ -10,7 +10,7 @@ import static lv.enes.orang.State.STDIN; import static lv.enes.orang.State.STDOUT; public class Main { - public static final String PROMPT = ">> "; + public static final String PROMPT = "orang-user> "; public static void main() throws IOException { repl(); @@ -66,7 +66,7 @@ public class Main { } try { - var prog = Parser.parseProgram(line); + var prog = Parser.parseReplProgram(line); evaluator = evaluator.visitProgram(prog); if (evaluator.lastResult() != null) { STDOUT.print("-> "); 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