diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-09-17 16:58:57 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-09-17 16:58:57 +0100 |
| commit | 0552d676bfa6e6b009132c540ae822e8bd148b4a (patch) | |
| tree | 88741a94bb4cb8fbecdebca7d46adf2393eb7825 /src/main/java | |
| parent | f7ea0788b8958553277859a08e581072e1a4050a (diff) | |
Disambiguate tuple expression statement from assignment
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/parser/Parser.java | 29 |
1 files changed, 28 insertions, 1 deletions
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<TokenType> 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<TokenType> 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<TokenType> tokens) { var start = tokens.position(); |
