From b9c7fbf5e06630076b93cace17863a6d36125e0d Mon Sep 17 00:00:00 2001 From: Uko Kokņevičs Date: Sun, 18 Aug 2024 23:45:38 +0800 Subject: Added explicit ignored/"underscore" arguments & top-level defs --- .../src/main/java/lv/enes/orang/parser/Parser.java | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) (limited to 'parser/src/main/java/lv') 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 6c86e85..3a2e931 100644 --- a/parser/src/main/java/lv/enes/orang/parser/Parser.java +++ b/parser/src/main/java/lv/enes/orang/parser/Parser.java @@ -59,11 +59,11 @@ public class Parser { return new Program(Collections.unmodifiableList(statements)); } - private static boolean isBinaryOp(Token token) { + 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 - -> true; - default -> false; + -> false; + default -> true; }; } @@ -143,6 +143,9 @@ public class Parser { consumeToken(Token.Type.PAREN_LEFT); consumeToken(Token.Type.PAREN_RIGHT); argSpecs.add(ArgSpec.nothing()); + } else if (input.peek().type() == Token.Type.UNDERSCORE) { + consumeToken(Token.Type.UNDERSCORE); + argSpecs.add(ArgSpec.ignored()); } else { break; } @@ -152,7 +155,7 @@ public class Parser { private Expression parseBinaryExpression() throws ParserException { var lhs = parseCallExpression(); - if (!isBinaryOp(input.peek())) { + if (isNotBinaryOp(input.peek())) { return lhs; } @@ -161,7 +164,7 @@ public class Parser { private Expression parseBinaryExpressionRhs(Expression lhs, BinaryExpression.Operator op) throws ParserException { var rhs = parseCallExpression(); - if (!isBinaryOp(input.peek())) { + if (isNotBinaryOp(input.peek())) { return new BinaryExpression(op, lhs, rhs); } @@ -187,11 +190,17 @@ public class Parser { return callee; } - private Definition parseDefinition() throws ParserException { + private Statement parseDefinition() throws ParserException { consumeToken(Token.Type.DEF); + if (maybeConsumeToken(Token.Type.UNDERSCORE)) { + consumeToken(Token.Type.EQUAL); + return new ExpressionStatement(parseExpression()); + } + var defSpec = parseDefSpec(); consumeToken(Token.Type.EQUAL); var value = parseExpression(); + if (defSpec.args().isEmpty()) { return new Definition(defSpec.name(), value); } else { -- cgit v1.2.3