aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-09-17 16:44:23 +0100
committerMichael Williamson <mike@zwobble.org>2023-09-17 16:44:31 +0100
commit4530282258bd61928646a7af792f30c0b46b016b (patch)
tree7a5d944ba67f1d356fdd8d369a83d2a03ee0aeed /src/main/java
parent891db26b0e9c1fe81b5b7f49d11a1e2a28af9987 (diff)
Parse tuple types
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedTupleTypeNode.java11
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedTypeLevelExpressionNode.java2
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java47
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java3
4 files changed, 56 insertions, 7 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTupleTypeNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTupleTypeNode.java
new file mode 100644
index 00000000..7b9e8e4c
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTupleTypeNode.java
@@ -0,0 +1,11 @@
+package org.shedlang.compiler.ast.untyped;
+
+import org.shedlang.compiler.sources.Source;
+
+import java.util.List;
+
+public record UntypedTupleTypeNode(
+ List<UntypedTypeLevelExpressionNode> elements,
+ Source source
+) implements UntypedTypeLevelExpressionNode {
+}
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTypeLevelExpressionNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTypeLevelExpressionNode.java
index 86ee9427..fdbc5320 100644
--- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTypeLevelExpressionNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTypeLevelExpressionNode.java
@@ -1,4 +1,4 @@
package org.shedlang.compiler.ast.untyped;
-public sealed interface UntypedTypeLevelExpressionNode extends UntypedNode permits UntypedTypeLevelReferenceNode {
+public sealed interface UntypedTypeLevelExpressionNode extends UntypedNode permits UntypedTupleTypeNode, UntypedTypeLevelReferenceNode {
}
diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java
index 919256c3..b6ce17a4 100644
--- a/src/main/java/org/shedlang/compiler/parser/Parser.java
+++ b/src/main/java/org/shedlang/compiler/parser/Parser.java
@@ -511,14 +511,16 @@ public class Parser {
}
static UntypedTypeLevelExpressionNode parseTopLevelTypeLevelExpression(TokenIterator<TokenType> tokens) {
- var start = tokens.position();
-
- var name = tokens.nextValue(TokenType.IDENTIFIER);
+ return switch (tokens.peek().tokenType()) {
+ case IDENTIFIER ->
+ parseTypeLevelReference(tokens);
- var end = tokens.position();
- var source = start.to(end);
+ case SYMBOL_HASH_PAREN_OPEN ->
+ parseTupleType(tokens);
- return new UntypedTypeLevelReferenceNode(name, source);
+ default ->
+ throw new UnexpectedTokenException("type-level expression", tokens.peek());
+ };
}
public static UntypedNamespaceNode parseNamespace(
@@ -630,6 +632,39 @@ public class Parser {
return new UntypedTupleNode(elements, source);
}
+ private static UntypedTypeLevelExpressionNode parseTupleType(
+ TokenIterator<TokenType> tokens
+ ) {
+ var start = tokens.position();
+
+ tokens.skip(TokenType.SYMBOL_HASH_PAREN_OPEN);
+
+ var elements = parseMany(
+ () -> tokens.isNext(TokenType.SYMBOL_PAREN_CLOSE),
+ () -> parseTopLevelTypeLevelExpression(tokens),
+ () -> tokens.trySkip(TokenType.SYMBOL_COMMA)
+ );
+
+ tokens.skip(TokenType.SYMBOL_PAREN_CLOSE);
+
+ var end = tokens.position();
+ var source = start.to(end);
+
+ return new UntypedTupleTypeNode(elements, source);
+ }
+
+
+ private static UntypedTypeLevelReferenceNode parseTypeLevelReference(TokenIterator<TokenType> tokens) {
+ var start = tokens.position();
+
+ var name = tokens.nextValue(TokenType.IDENTIFIER);
+
+ var end = tokens.position();
+ var source = start.to(end);
+
+ return new UntypedTypeLevelReferenceNode(name, 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 1a523df0..6839b500 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -776,6 +776,9 @@ public class TypeChecker {
TypeCheckerContext context
) {
return switch (untyped) {
+ case UntypedTupleTypeNode tuple ->
+ throw new UnsupportedOperationException("TODO");
+
case UntypedTypeLevelReferenceNode reference ->
typeCheckTypeLevelReference(valueType, reference, context);
};