aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-09-17 16:31:02 +0100
committerMichael Williamson <mike@zwobble.org>2023-09-17 16:31:02 +0100
commit6587267906ea7b43270868b8bdee96bceed17602 (patch)
tree05f9268ac178607ae547ba514949d93cf523278c /src/main/java
parent99bfde40214711b05043907ad773304bd8ea5e93 (diff)
Parse tuple targets
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java19
1 files changed, 18 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 c7ab639f..323c7dad 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 ->
+ case KEYWORD_ASSIGN, KEYWORD_VAL, KEYWORD_VAR, SYMBOL_HASH_PAREN_OPEN ->
parseAssign(tokens);
case KEYWORD_RETURN ->
@@ -585,6 +585,23 @@ public class Parser {
yield new UntypedTargetNode.Var(name, source);
}
+ case SYMBOL_HASH_PAREN_OPEN -> {
+ tokens.skip(TokenType.SYMBOL_HASH_PAREN_OPEN);
+
+ var elements = parseMany(
+ () -> tokens.isNext(TokenType.SYMBOL_PAREN_CLOSE),
+ () -> parseTarget(tokens),
+ () -> tokens.trySkip(TokenType.SYMBOL_COMMA)
+ );
+
+ tokens.skip(TokenType.SYMBOL_PAREN_CLOSE);
+
+ var end = tokens.position();
+ var source = start.to(end);
+
+ yield new UntypedTargetNode.Tuple(elements, source);
+ }
+
default ->
throw new UnexpectedTokenException("namespace statement", tokens.peek());
};