summaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-04-28 23:33:55 +0100
committerMichael Williamson <mike@zwobble.org>2026-04-28 23:33:55 +0100
commitceef673a9681db167b4a47053f78cc9ee05d0ffb (patch)
treee56aa0b7462cb75bede51289b2cd9251b523fb2a /src/main
parent8f9f4903d52646ee3a87c4b435c008beac4f13b9 (diff)
Parse sum types
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedSumDefinitionNode.java2
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedSumVariantDefinitionNode.java9
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java53
3 files changed, 62 insertions, 2 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedSumDefinitionNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedSumDefinitionNode.java
index 7969806..66acc08 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedSumDefinitionNode.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedSumDefinitionNode.java
@@ -6,7 +6,7 @@ import java.util.List;
public record UntypedSumDefinitionNode(
String name,
- List<UntypedTypeLevelExpressionNode> variants,
+ List<UntypedSumVariantDefinitionNode> variants,
Source source
) implements UntypedNamespaceStatementNode {
}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedSumVariantDefinitionNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedSumVariantDefinitionNode.java
new file mode 100644
index 0000000..91a9f0d
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedSumVariantDefinitionNode.java
@@ -0,0 +1,9 @@
+package org.zwobble.hobgoblin.compiler.ast.untyped;
+
+import org.zwobble.hobgoblin.compiler.sources.Source;
+
+public record UntypedSumVariantDefinitionNode(
+ UntypedTypeLevelExpressionNode type,
+ Source source
+) implements UntypedNode {
+}
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 fbf38bb..4cd35f8 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java
@@ -49,7 +49,13 @@ public class Parser {
static UntypedNamespaceStatementNode parseNamespaceStatement(
TokenIterator tokens
) {
- return parseStructDefinition(tokens);
+ if (tokens.isNext(TokenType.KEYWORD_STRUCT)) {
+ return parseStructDefinition(tokens);
+ } else if (tokens.isNext(TokenType.KEYWORD_SUM)) {
+ return parseSumDefinition(tokens);
+ } else {
+ throw new UnsupportedOperationException("TODO");
+ }
}
private static UntypedStructDefinitionNode parseStructDefinition(
@@ -100,6 +106,51 @@ public class Parser {
);
}
+ private static UntypedSumDefinitionNode parseSumDefinition(
+ TokenIterator tokens
+ ) {
+ var start = tokens.startPosition();
+
+ tokens.skip(TokenType.KEYWORD_SUM);
+ var name = tokens.next(TokenType.IDENTIFIER);
+ tokens.skip(TokenType.SYMBOL_BRACE_OPEN);
+
+ var variants = parseMany(
+ () -> tokens.isNext(TokenType.SYMBOL_BRACE_CLOSE),
+ () -> parseSumVariantDefinition(tokens),
+ () -> true
+ );
+
+ tokens.skip(TokenType.SYMBOL_BRACE_CLOSE);
+
+ var end = tokens.endPosition();
+ var source = createSource(start, end);
+
+ return new UntypedSumDefinitionNode(
+ name.charSequence().toString(),
+ variants,
+ source
+ );
+ }
+
+ private static UntypedSumVariantDefinitionNode parseSumVariantDefinition(
+ TokenIterator tokens
+ ) {
+ var start = tokens.startPosition();
+
+ tokens.skip(TokenType.KEYWORD_VARIANT);
+ var type = parseTypeLevelExpression(tokens);
+ tokens.skip(TokenType.SYMBOL_SEMICOLON);
+
+ var end = tokens.endPosition();
+ var source = createSource(start, end);
+
+ return new UntypedSumVariantDefinitionNode(
+ type,
+ source
+ );
+ }
+
static UntypedTypeLevelExpressionNode parseTypeLevelExpression(
TokenIterator tokens
) {