From 4530282258bd61928646a7af792f30c0b46b016b Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 17 Sep 2023 16:44:23 +0100 Subject: Parse tuple types --- .../compiler/ast/untyped/UntypedTupleTypeNode.java | 11 +++++ .../untyped/UntypedTypeLevelExpressionNode.java | 2 +- .../java/org/shedlang/compiler/parser/Parser.java | 47 +++++++++++++++++++--- .../shedlang/compiler/typechecker/TypeChecker.java | 3 ++ 4 files changed, 56 insertions(+), 7 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/ast/untyped/UntypedTupleTypeNode.java (limited to 'src/main/java') 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 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 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 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 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 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); }; -- cgit v1.2.3