From 0552d676bfa6e6b009132c540ae822e8bd148b4a Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 17 Sep 2023 16:58:57 +0100 Subject: Disambiguate tuple expression statement from assignment --- .../java/org/shedlang/compiler/parser/Parser.java | 29 +++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java index 17511bcc..44c132e7 100644 --- a/src/main/java/org/shedlang/compiler/parser/Parser.java +++ b/src/main/java/org/shedlang/compiler/parser/Parser.java @@ -301,7 +301,7 @@ public class Parser { static UntypedFunctionStatementNode parseFunctionStatement(TokenIterator tokens) { return switch (tokens.peek().tokenType()) { - case KEYWORD_ASSIGN, KEYWORD_VAL, KEYWORD_VAR, SYMBOL_HASH_PAREN_OPEN -> + case KEYWORD_ASSIGN, KEYWORD_VAL, KEYWORD_VAR -> parseAssign(tokens); case KEYWORD_RETURN -> @@ -310,11 +310,38 @@ public class Parser { case KEYWORD_WHILE -> parseWhile(tokens); + case SYMBOL_HASH_PAREN_OPEN -> + parseFunctionStatementTuple(tokens); + default -> parseExpressionStatement(tokens); }; } + private static UntypedFunctionStatementNode parseFunctionStatementTuple( + TokenIterator tokens + ) { + // We need to disambiguate destructuring assignments from + // tuple expression statements. + + var offset = 0; + while (true) { + var token = tokens.peek(offset); + switch (token.tokenType()) { + case SYMBOL_HASH_PAREN_OPEN -> + offset += 1; + + case KEYWORD_ASSIGN, KEYWORD_VAL, KEYWORD_VAR -> { + return parseAssign(tokens); + } + + default -> { + return parseExpressionStatement(tokens); + } + } + } + } + private static UntypedExpressionNode parseIf(TokenIterator tokens) { var start = tokens.position(); -- cgit v1.2.3