diff options
Diffstat (limited to 'parser')
| -rw-r--r-- | parser/src/main/java/lv/enes/orang/parser/Parser.java | 27 |
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 { |