aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-09-17 16:58:57 +0100
committerMichael Williamson <mike@zwobble.org>2023-09-17 16:58:57 +0100
commit0552d676bfa6e6b009132c540ae822e8bd148b4a (patch)
tree88741a94bb4cb8fbecdebca7d46adf2393eb7825 /src/main/java
parentf7ea0788b8958553277859a08e581072e1a4050a (diff)
Disambiguate tuple expression statement from assignment
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java29
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();