From 3f8039bff09578fc3219503ca34a4d99833a7323 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 3 May 2026 12:00:38 +0100 Subject: Parse constructed types --- .../ast/untyped/UntypedConstructedTypeNode.java | 12 ++++++++++++ .../untyped/UntypedTypeLevelExpressionNode.java | 2 +- .../zwobble/hobgoblin/compiler/parser/Parser.java | 22 ++++++++++++++++++++++ .../hobgoblin/compiler/parser/TokenIterator.java | 10 ++++++++++ .../compiler/typechecker/TypeChecker.java | 3 +++ 5 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedConstructedTypeNode.java (limited to 'src/main/java/org') diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedConstructedTypeNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedConstructedTypeNode.java new file mode 100644 index 0000000..6615995 --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedConstructedTypeNode.java @@ -0,0 +1,12 @@ +package org.zwobble.hobgoblin.compiler.ast.untyped; + +import org.zwobble.hobgoblin.compiler.sources.Source; + +import java.util.List; + +public record UntypedConstructedTypeNode( + UntypedTypeLevelExpressionNode receiver, + List args, + Source source +) implements UntypedTypeLevelExpressionNode { +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedTypeLevelExpressionNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedTypeLevelExpressionNode.java index 871393d..12414c5 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedTypeLevelExpressionNode.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedTypeLevelExpressionNode.java @@ -1,4 +1,4 @@ package org.zwobble.hobgoblin.compiler.ast.untyped; -public sealed interface UntypedTypeLevelExpressionNode extends UntypedNode permits UntypedTypeLevelReferenceNode { +public sealed interface UntypedTypeLevelExpressionNode extends UntypedNode permits UntypedConstructedTypeNode, UntypedTypeLevelReferenceNode { } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java b/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java index 4cd35f8..d60b249 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java @@ -156,6 +156,28 @@ public class Parser { ) { var start = tokens.startPosition(); + UntypedTypeLevelExpressionNode expression = parsePrimaryTypeLevelExpression(tokens); + + while (tokens.trySkip(TokenType.SYMBOL_SQUARE_OPEN)) { + var args = parseMany( + () -> tokens.isNext(TokenType.SYMBOL_SQUARE_CLOSE), + () -> parseTypeLevelExpression(tokens), + () -> tokens.trySkip(TokenType.SYMBOL_COMMA) + ); + tokens.skip(TokenType.SYMBOL_SQUARE_CLOSE); + + var end = tokens.endPosition(); + var source = createSource(start, end); + + expression = new UntypedConstructedTypeNode(expression, args, source); + } + + return expression; + } + + private static UntypedTypeLevelReferenceNode parsePrimaryTypeLevelExpression(TokenIterator tokens) { + var start = tokens.startPosition(); + var name = tokens.next(TokenType.IDENTIFIER); var end = tokens.endPosition(); diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenIterator.java b/src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenIterator.java index 0ae3d28..55edd97 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenIterator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenIterator.java @@ -44,6 +44,16 @@ class TokenIterator { } } + public boolean trySkip(TokenType tokenType) { + var token = peek(); + if (token.tokenType().equals(tokenType)) { + this.tokenIndex++; + return true; + } else { + return false; + } + } + private Token getAbsolute(int index) { if (index < this.tokens.size()) { return this.tokens.get(index); diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java index c713c70..a535bc8 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java @@ -143,6 +143,9 @@ public class TypeChecker { TypeCheckerNamespaceContext context ) { return switch (untyped) { + case UntypedConstructedTypeNode untypedConstructedType -> + throw new UnsupportedOperationException("TODO"); + case UntypedTypeLevelReferenceNode untypedTypeLevelReference -> typeCheckTypeLevelReference(untypedTypeLevelReference, context); }; -- cgit v1.2.3