From 97b4f889cd2c3a692da98e681016414587ebf204 Mon Sep 17 00:00:00 2001 From: Uko Kokņevičs Date: Sun, 25 Aug 2024 17:56:34 +0800 Subject: Added maps --- .../src/main/java/lv/enes/orang/parser/Parser.java | 46 ++++++++++++++++------ 1 file changed, 34 insertions(+), 12 deletions(-) (limited to 'parser/src') 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 { private ArrayExpression parseArray() throws ParserException { consumeToken(Token.Type.BRACKET_LEFT); - if (maybeConsumeToken(Token.Type.BRACKET_RIGHT)) { - return new ArrayExpression(List.of()); - } - var items = new ArrayList(); - do { + while (!maybeConsumeToken(Token.Type.BRACKET_RIGHT)) { items.add(parseExpression()); - } while (maybeConsumeToken(Token.Type.COMMA)); - consumeToken(Token.Type.BRACKET_RIGHT); - + if (!maybeConsumeToken(Token.Type.COMMA)) { + consumeToken(Token.Type.BRACKET_RIGHT); + break; + } + } + items.trimToSize(); return new ArrayExpression(Collections.unmodifiableList(items)); } @@ -298,6 +297,24 @@ public class Parser { return new LetInExpression(Collections.unmodifiableList(bindings), body); } + private MapExpression parseMap() throws ParserException { + consumeToken(Token.Type.BRACE_LEFT); + var entries = new ArrayList(); + while (!maybeConsumeToken(Token.Type.BRACE_RIGHT)) { + var from = parseExpression(); + consumeToken(Token.Type.MINUS_GREATER); + var to = parseExpression(); + entries.add(new MapExpression.MapPair(from, to)); + + if (!maybeConsumeToken(Token.Type.COMMA)) { + consumeToken(Token.Type.BRACE_RIGHT); + break; + } + } + entries.trimToSize(); + return new MapExpression(Collections.unmodifiableList(entries)); + } + private Expression parseMemberAccessExpression() throws ParserException { var expr = parseSimpleExpression(); while (maybeConsumeToken(Token.Type.PERIOD_BRACKET_LEFT)) { @@ -335,17 +352,19 @@ public class Parser { case IDENTIFIER -> new VariableExpression(input.next().literal()); case STRING -> parseString(); case BRACKET_LEFT -> parseArray(); + case BRACE_LEFT -> parseMap(); + case DO -> parseDoExpression(); + case FN -> parseFnExpression(); case IF -> parseIfElseExpression(); case LET -> parseLetInExpression(); - case FN -> parseFnExpression(); - case DO -> parseDoExpression(); default -> throw new ParserException(STR."Unexpected token \{input.peek()}"); }; } private boolean couldStartSimpleExpression(Token.Type type) { return switch (type) { - case PAREN_LEFT, TRUE, FALSE, INTEGER, IDENTIFIER, STRING, BRACKET_LEFT, IF, LET, FN, DO -> true; + case PAREN_LEFT, TRUE, FALSE, INTEGER, IDENTIFIER, STRING, BRACKET_LEFT, BRACE_LEFT, DO, FN, IF, LET + -> true; default -> false; }; } @@ -382,7 +401,10 @@ public class Parser { exprs.add(first); do { exprs.add(parseExpression()); - maybeConsumeToken(Token.Type.COMMA); + if (!maybeConsumeToken(Token.Type.COMMA)) { + consumeToken(Token.Type.PAREN_RIGHT); + break; + } } while (!maybeConsumeToken(Token.Type.PAREN_RIGHT)); exprs.trimToSize(); return new TupleExpression(exprs); -- cgit v1.2.3