summaryrefslogtreecommitdiff
path: root/parser
diff options
context:
space:
mode:
authorGravatar Uko Kokņevičs2024-08-18 23:45:38 +0800
committerGravatar Uko Kokņevičs2024-08-18 23:45:38 +0800
commitb9c7fbf5e06630076b93cace17863a6d36125e0d (patch)
treee23114ae41cab50d12a51f035f5bacdd239e19ed /parser
parentSome more modularisation (diff)
downloadorang-b9c7fbf5e06630076b93cace17863a6d36125e0d.tar.gz
orang-b9c7fbf5e06630076b93cace17863a6d36125e0d.tar.xz
orang-b9c7fbf5e06630076b93cace17863a6d36125e0d.zip
Added explicit ignored/"underscore" arguments & top-level defs
Diffstat (limited to 'parser')
-rw-r--r--parser/src/main/java/lv/enes/orang/parser/Parser.java21
1 files changed, 15 insertions, 6 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 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 {
59 return new Program(Collections.unmodifiableList(statements)); 59 return new Program(Collections.unmodifiableList(statements));
60 } 60 }
61 61
62 private static boolean isBinaryOp(Token token) { 62 private static boolean isNotBinaryOp(Token token) {
63 return switch (token.type()) { 63 return switch (token.type()) {
64 case ASTERISK, SLASH, PLUS, MINUS, QUESTION_EQUAL, SLASH_EQUAL, GREATER, GREATER_EQUAL, LESS, LESS_EQUAL 64 case ASTERISK, SLASH, PLUS, MINUS, QUESTION_EQUAL, SLASH_EQUAL, GREATER, GREATER_EQUAL, LESS, LESS_EQUAL
65 -> true; 65 -> false;
66 default -> false; 66 default -> true;
67 }; 67 };
68 } 68 }
69 69
@@ -143,6 +143,9 @@ public class Parser {
143 consumeToken(Token.Type.PAREN_LEFT); 143 consumeToken(Token.Type.PAREN_LEFT);
144 consumeToken(Token.Type.PAREN_RIGHT); 144 consumeToken(Token.Type.PAREN_RIGHT);
145 argSpecs.add(ArgSpec.nothing()); 145 argSpecs.add(ArgSpec.nothing());
146 } else if (input.peek().type() == Token.Type.UNDERSCORE) {
147 consumeToken(Token.Type.UNDERSCORE);
148 argSpecs.add(ArgSpec.ignored());
146 } else { 149 } else {
147 break; 150 break;
148 } 151 }
@@ -152,7 +155,7 @@ public class Parser {
152 155
153 private Expression parseBinaryExpression() throws ParserException { 156 private Expression parseBinaryExpression() throws ParserException {
154 var lhs = parseCallExpression(); 157 var lhs = parseCallExpression();
155 if (!isBinaryOp(input.peek())) { 158 if (isNotBinaryOp(input.peek())) {
156 return lhs; 159 return lhs;
157 } 160 }
158 161
@@ -161,7 +164,7 @@ public class Parser {
161 164
162 private Expression parseBinaryExpressionRhs(Expression lhs, BinaryExpression.Operator op) throws ParserException { 165 private Expression parseBinaryExpressionRhs(Expression lhs, BinaryExpression.Operator op) throws ParserException {
163 var rhs = parseCallExpression(); 166 var rhs = parseCallExpression();
164 if (!isBinaryOp(input.peek())) { 167 if (isNotBinaryOp(input.peek())) {
165 return new BinaryExpression(op, lhs, rhs); 168 return new BinaryExpression(op, lhs, rhs);
166 } 169 }
167 170
@@ -187,11 +190,17 @@ public class Parser {
187 return callee; 190 return callee;
188 } 191 }
189 192
190 private Definition parseDefinition() throws ParserException { 193 private Statement parseDefinition() throws ParserException {
191 consumeToken(Token.Type.DEF); 194 consumeToken(Token.Type.DEF);
195 if (maybeConsumeToken(Token.Type.UNDERSCORE)) {
196 consumeToken(Token.Type.EQUAL);
197 return new ExpressionStatement(parseExpression());
198 }
199
192 var defSpec = parseDefSpec(); 200 var defSpec = parseDefSpec();
193 consumeToken(Token.Type.EQUAL); 201 consumeToken(Token.Type.EQUAL);
194 var value = parseExpression(); 202 var value = parseExpression();
203
195 if (defSpec.args().isEmpty()) { 204 if (defSpec.args().isEmpty()) {
196 return new Definition(defSpec.name(), value); 205 return new Definition(defSpec.name(), value);
197 } else { 206 } else {