diff options
Diffstat (limited to 'parser/src/main/java')
| -rw-r--r-- | parser/src/main/java/lv/enes/orang/parser/Parser.java | 15 |
1 files changed, 14 insertions, 1 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 25b57d4..0ff1f78 100644 --- a/parser/src/main/java/lv/enes/orang/parser/Parser.java +++ b/parser/src/main/java/lv/enes/orang/parser/Parser.java | |||
| @@ -283,9 +283,12 @@ public class Parser { | |||
| 283 | case PAREN_LEFT -> { | 283 | case PAREN_LEFT -> { |
| 284 | consumeToken(Token.Type.PAREN_LEFT); | 284 | consumeToken(Token.Type.PAREN_LEFT); |
| 285 | if (maybeConsumeToken(Token.Type.PAREN_RIGHT)) { | 285 | if (maybeConsumeToken(Token.Type.PAREN_RIGHT)) { |
| 286 | yield VoidExpression.INSTANCE; | 286 | yield EmptyTupleLiteral.INSTANCE; |
| 287 | } | 287 | } |
| 288 | var expr = parseExpression(); | 288 | var expr = parseExpression(); |
| 289 | if (maybeConsumeToken(Token.Type.COMMA)) { | ||
| 290 | yield parseTupleExpression(expr); | ||
| 291 | } | ||
| 289 | consumeToken(Token.Type.PAREN_RIGHT); | 292 | consumeToken(Token.Type.PAREN_RIGHT); |
| 290 | yield expr; | 293 | yield expr; |
| 291 | } | 294 | } |
| @@ -336,6 +339,16 @@ public class Parser { | |||
| 336 | return new StringLiteral(sb.toString()); | 339 | return new StringLiteral(sb.toString()); |
| 337 | } | 340 | } |
| 338 | 341 | ||
| 342 | private TupleExpression parseTupleExpression(Expression first) throws ParserException { | ||
| 343 | var exprs = new ArrayList<Expression>(); | ||
| 344 | exprs.add(first); | ||
| 345 | do { | ||
| 346 | exprs.add(parseExpression()); | ||
| 347 | maybeConsumeToken(Token.Type.COMMA); | ||
| 348 | } while (!maybeConsumeToken(Token.Type.PAREN_RIGHT)); | ||
| 349 | return new TupleExpression(new NonEmptyList<>(exprs)); | ||
| 350 | } | ||
| 351 | |||
| 339 | private Expression parseUnaryExpression() throws ParserException { | 352 | private Expression parseUnaryExpression() throws ParserException { |
| 340 | if (isUnaryOp(input.peek())) { | 353 | if (isUnaryOp(input.peek())) { |
| 341 | var op = toUnaryOp(input.next()); | 354 | var op = toUnaryOp(input.next()); |