diff options
| author | 2024-08-25 17:56:34 +0800 | |
|---|---|---|
| committer | 2024-08-25 17:56:34 +0800 | |
| commit | 97b4f889cd2c3a692da98e681016414587ebf204 (patch) | |
| tree | be3285c61a1e2ebb6da01506e8c793bb3afab482 /parser/src/main/java | |
| parent | Added array access. (diff) | |
| download | orang-97b4f889cd2c3a692da98e681016414587ebf204.tar.gz orang-97b4f889cd2c3a692da98e681016414587ebf204.tar.xz orang-97b4f889cd2c3a692da98e681016414587ebf204.zip | |
Diffstat (limited to 'parser/src/main/java')
| -rw-r--r-- | parser/src/main/java/lv/enes/orang/parser/Parser.java | 46 |
1 files changed, 34 insertions, 12 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 3d1d42b..55da6fb 100644 --- a/parser/src/main/java/lv/enes/orang/parser/Parser.java +++ b/parser/src/main/java/lv/enes/orang/parser/Parser.java | |||
| @@ -116,16 +116,15 @@ public class Parser { | |||
| 116 | 116 | ||
| 117 | private ArrayExpression parseArray() throws ParserException { | 117 | private ArrayExpression parseArray() throws ParserException { |
| 118 | consumeToken(Token.Type.BRACKET_LEFT); | 118 | consumeToken(Token.Type.BRACKET_LEFT); |
| 119 | if (maybeConsumeToken(Token.Type.BRACKET_RIGHT)) { | ||
| 120 | return new ArrayExpression(List.of()); | ||
| 121 | } | ||
| 122 | |||
| 123 | var items = new ArrayList<Expression>(); | 119 | var items = new ArrayList<Expression>(); |
| 124 | do { | 120 | while (!maybeConsumeToken(Token.Type.BRACKET_RIGHT)) { |
| 125 | items.add(parseExpression()); | 121 | items.add(parseExpression()); |
| 126 | } while (maybeConsumeToken(Token.Type.COMMA)); | 122 | if (!maybeConsumeToken(Token.Type.COMMA)) { |
| 127 | consumeToken(Token.Type.BRACKET_RIGHT); | 123 | consumeToken(Token.Type.BRACKET_RIGHT); |
| 128 | 124 | break; | |
| 125 | } | ||
| 126 | } | ||
| 127 | items.trimToSize(); | ||
| 129 | return new ArrayExpression(Collections.unmodifiableList(items)); | 128 | return new ArrayExpression(Collections.unmodifiableList(items)); |
| 130 | } | 129 | } |
| 131 | 130 | ||
| @@ -298,6 +297,24 @@ public class Parser { | |||
| 298 | return new LetInExpression(Collections.unmodifiableList(bindings), body); | 297 | return new LetInExpression(Collections.unmodifiableList(bindings), body); |
| 299 | } | 298 | } |
| 300 | 299 | ||
| 300 | private MapExpression parseMap() throws ParserException { | ||
| 301 | consumeToken(Token.Type.BRACE_LEFT); | ||
| 302 | var entries = new ArrayList<MapExpression.MapPair>(); | ||
| 303 | while (!maybeConsumeToken(Token.Type.BRACE_RIGHT)) { | ||
| 304 | var from = parseExpression(); | ||
| 305 | consumeToken(Token.Type.MINUS_GREATER); | ||
| 306 | var to = parseExpression(); | ||
| 307 | entries.add(new MapExpression.MapPair(from, to)); | ||
| 308 | |||
| 309 | if (!maybeConsumeToken(Token.Type.COMMA)) { | ||
| 310 | consumeToken(Token.Type.BRACE_RIGHT); | ||
| 311 | break; | ||
| 312 | } | ||
| 313 | } | ||
| 314 | entries.trimToSize(); | ||
| 315 | return new MapExpression(Collections.unmodifiableList(entries)); | ||
| 316 | } | ||
| 317 | |||
| 301 | private Expression parseMemberAccessExpression() throws ParserException { | 318 | private Expression parseMemberAccessExpression() throws ParserException { |
| 302 | var expr = parseSimpleExpression(); | 319 | var expr = parseSimpleExpression(); |
| 303 | while (maybeConsumeToken(Token.Type.PERIOD_BRACKET_LEFT)) { | 320 | while (maybeConsumeToken(Token.Type.PERIOD_BRACKET_LEFT)) { |
| @@ -335,17 +352,19 @@ public class Parser { | |||
| 335 | case IDENTIFIER -> new VariableExpression(input.next().literal()); | 352 | case IDENTIFIER -> new VariableExpression(input.next().literal()); |
| 336 | case STRING -> parseString(); | 353 | case STRING -> parseString(); |
| 337 | case BRACKET_LEFT -> parseArray(); | 354 | case BRACKET_LEFT -> parseArray(); |
| 355 | case BRACE_LEFT -> parseMap(); | ||
| 356 | case DO -> parseDoExpression(); | ||
| 357 | case FN -> parseFnExpression(); | ||
| 338 | case IF -> parseIfElseExpression(); | 358 | case IF -> parseIfElseExpression(); |
| 339 | case LET -> parseLetInExpression(); | 359 | case LET -> parseLetInExpression(); |
| 340 | case FN -> parseFnExpression(); | ||
| 341 | case DO -> parseDoExpression(); | ||
| 342 | default -> throw new ParserException(STR."Unexpected token \{input.peek()}"); | 360 | default -> throw new ParserException(STR."Unexpected token \{input.peek()}"); |
| 343 | }; | 361 | }; |
| 344 | } | 362 | } |
| 345 | 363 | ||
| 346 | private boolean couldStartSimpleExpression(Token.Type type) { | 364 | private boolean couldStartSimpleExpression(Token.Type type) { |
| 347 | return switch (type) { | 365 | return switch (type) { |
| 348 | case PAREN_LEFT, TRUE, FALSE, INTEGER, IDENTIFIER, STRING, BRACKET_LEFT, IF, LET, FN, DO -> true; | 366 | case PAREN_LEFT, TRUE, FALSE, INTEGER, IDENTIFIER, STRING, BRACKET_LEFT, BRACE_LEFT, DO, FN, IF, LET |
| 367 | -> true; | ||
| 349 | default -> false; | 368 | default -> false; |
| 350 | }; | 369 | }; |
| 351 | } | 370 | } |
| @@ -382,7 +401,10 @@ public class Parser { | |||
| 382 | exprs.add(first); | 401 | exprs.add(first); |
| 383 | do { | 402 | do { |
| 384 | exprs.add(parseExpression()); | 403 | exprs.add(parseExpression()); |
| 385 | maybeConsumeToken(Token.Type.COMMA); | 404 | if (!maybeConsumeToken(Token.Type.COMMA)) { |
| 405 | consumeToken(Token.Type.PAREN_RIGHT); | ||
| 406 | break; | ||
| 407 | } | ||
| 386 | } while (!maybeConsumeToken(Token.Type.PAREN_RIGHT)); | 408 | } while (!maybeConsumeToken(Token.Type.PAREN_RIGHT)); |
| 387 | exprs.trimToSize(); | 409 | exprs.trimToSize(); |
| 388 | return new TupleExpression(exprs); | 410 | return new TupleExpression(exprs); |