summaryrefslogtreecommitdiff
path: root/parser/src/main/java/lv/enes
diff options
context:
space:
mode:
authorGravatar Uko Kokņevičs2024-08-25 17:56:34 +0800
committerGravatar Uko Kokņevičs2024-08-25 17:56:34 +0800
commit97b4f889cd2c3a692da98e681016414587ebf204 (patch)
treebe3285c61a1e2ebb6da01506e8c793bb3afab482 /parser/src/main/java/lv/enes
parentAdded array access. (diff)
downloadorang-main.tar.gz
orang-main.tar.xz
orang-main.zip
Added mapsHEADmain
Diffstat (limited to 'parser/src/main/java/lv/enes')
-rw-r--r--parser/src/main/java/lv/enes/orang/parser/Parser.java46
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);