aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-09-17 16:38:54 +0100
committerMichael Williamson <mike@zwobble.org>2023-09-17 16:39:00 +0100
commit891db26b0e9c1fe81b5b7f49d11a1e2a28af9987 (patch)
tree2c119d910062a02979cb0b90c3b3cf7960c214da /src/main/java
parent6587267906ea7b43270868b8bdee96bceed17602 (diff)
Parse tuple expressions
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedExpressionNode.java2
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedTupleNode.java11
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java23
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java3
4 files changed, 38 insertions, 1 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedExpressionNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedExpressionNode.java
index 729d8279..ad227d81 100644
--- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedExpressionNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedExpressionNode.java
@@ -1,5 +1,5 @@
package org.shedlang.compiler.ast.untyped;
public sealed interface UntypedExpressionNode extends UntypedNode
- permits UntypedBinaryOperationNode, UntypedBoolLiteralNode, UntypedCallNode, UntypedIfNode, UntypedIntLiteralNode, UntypedReferenceNode, UntypedStringLiteralNode {
+ permits UntypedBinaryOperationNode, UntypedBoolLiteralNode, UntypedCallNode, UntypedIfNode, UntypedIntLiteralNode, UntypedReferenceNode, UntypedStringLiteralNode, UntypedTupleNode {
}
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTupleNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTupleNode.java
new file mode 100644
index 00000000..cf0107bb
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTupleNode.java
@@ -0,0 +1,11 @@
+package org.shedlang.compiler.ast.untyped;
+
+import org.shedlang.compiler.sources.Source;
+
+import java.util.List;
+
+public record UntypedTupleNode(
+ List<UntypedExpressionNode> elements,
+ Source source
+) implements UntypedExpressionNode {
+}
diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java
index 323c7dad..919256c3 100644
--- a/src/main/java/org/shedlang/compiler/parser/Parser.java
+++ b/src/main/java/org/shedlang/compiler/parser/Parser.java
@@ -455,6 +455,8 @@ public class Parser {
case STRING -> parseStringLiteral(tokens);
+ case SYMBOL_HASH_PAREN_OPEN -> parseTuple(tokens);
+
default ->
throw new UnexpectedTokenException("expression", tokens.peek());
};
@@ -607,6 +609,27 @@ public class Parser {
};
}
+ private static UntypedExpressionNode parseTuple(
+ TokenIterator<TokenType> tokens
+ ) {
+ var start = tokens.position();
+
+ tokens.skip(TokenType.SYMBOL_HASH_PAREN_OPEN);
+
+ var elements = parseMany(
+ () -> tokens.isNext(TokenType.SYMBOL_PAREN_CLOSE),
+ () -> parseTopLevelExpression(tokens),
+ () -> tokens.trySkip(TokenType.SYMBOL_COMMA)
+ );
+
+ tokens.skip(TokenType.SYMBOL_PAREN_CLOSE);
+
+ var end = tokens.position();
+ var source = start.to(end);
+
+ return new UntypedTupleNode(elements, source);
+ }
+
private static UntypedFunctionStatementNode parseWhile(
TokenIterator<TokenType> tokens
) {
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index bc5ff8b1..1a523df0 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -371,6 +371,9 @@ public class TypeChecker {
case UntypedStringLiteralNode untypedStringLiteral ->
typeCheckStringLiteral(untypedStringLiteral, context);
+
+ case UntypedTupleNode untypedTuple ->
+ throw new UnsupportedOperationException("TODO");
};
}