summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-10-25 09:38:14 +0000
committerMichael Williamson <mike@zwobble.org>2026-10-25 09:38:14 +0000
commit9dfbe7eec5d28f59e32882e6f99c03153fbe2ab8 (patch)
treed5495cde2f40babbae5d490fc94144eb34d5bbb7 /src/main/java
parenta8ad67dc75904eab189706ff3875d03ffe347ac8 (diff)
Parse return statement
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedReturnNode.java42
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedStatementNode.java18
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java23
3 files changed, 83 insertions, 0 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedReturnNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedReturnNode.java
new file mode 100644
index 0000000..f115b24
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedReturnNode.java
@@ -0,0 +1,42 @@
+// Generated by hobgoblin.
+
+package org.zwobble.hobgoblin.compiler.ast.untyped;
+
+// Custom area start: org.zwobble.hobgoblin.compiler.ast.untyped.UntypedReturnNode imports
+// Custom area end: org.zwobble.hobgoblin.compiler.ast.untyped.UntypedReturnNode imports
+
+public record UntypedReturnNode(
+ org.zwobble.hobgoblin.compiler.ast.untyped.UntypedExpressionNode expression,
+ org.zwobble.hobgoblin.compiler.sources.Source source
+) implements org.zwobble.hobgoblin.compiler.ast.untyped.UntypedStatementNode {
+ public static org.zwobble.hobgoblin.compiler.ast.untyped.UntypedReturnNode.Builder arbitrary() {
+ return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedReturnNode.Builder(org.zwobble.hobgoblin.compiler.ast.untyped.UntypedReferenceNode.arbitrary().build(), org.zwobble.hobgoblin.compiler.sources.HobgoblinNativeSources.arbitrarySource());
+ }
+
+ public record Builder(
+ org.zwobble.hobgoblin.compiler.ast.untyped.UntypedExpressionNode expression,
+ org.zwobble.hobgoblin.compiler.sources.Source source
+ ) implements org.zwobble.hobgoblin.compiler.ast.untyped.UntypedStatementNode.Builder {
+ public org.zwobble.hobgoblin.compiler.ast.untyped.UntypedReturnNode build() {
+ return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedReturnNode(expression, source);
+ }
+
+ public org.zwobble.hobgoblin.compiler.ast.untyped.UntypedReturnNode.Builder withExpression(org.zwobble.hobgoblin.compiler.ast.untyped.UntypedExpressionNode expression) {
+ return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedReturnNode.Builder(expression, source);
+ }
+
+ public org.zwobble.hobgoblin.compiler.ast.untyped.UntypedReturnNode.Builder withExpression(org.zwobble.hobgoblin.compiler.ast.untyped.UntypedExpressionNode.Builder expression) {
+ return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedReturnNode.Builder(expression.build(), source);
+ }
+
+ public org.zwobble.hobgoblin.compiler.ast.untyped.UntypedReturnNode.Builder withSource(org.zwobble.hobgoblin.compiler.sources.Source source) {
+ return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedReturnNode.Builder(expression, source);
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.ast.untyped.UntypedReturnNode.Builder body
+ // Custom area end: org.zwobble.hobgoblin.compiler.ast.untyped.UntypedReturnNode.Builder body
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.ast.untyped.UntypedReturnNode body
+ // Custom area end: org.zwobble.hobgoblin.compiler.ast.untyped.UntypedReturnNode body
+}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedStatementNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedStatementNode.java
new file mode 100644
index 0000000..8121f93
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedStatementNode.java
@@ -0,0 +1,18 @@
+// Generated by hobgoblin.
+
+package org.zwobble.hobgoblin.compiler.ast.untyped;
+
+// Custom area start: org.zwobble.hobgoblin.compiler.ast.untyped.UntypedStatementNode imports
+// Custom area end: org.zwobble.hobgoblin.compiler.ast.untyped.UntypedStatementNode imports
+
+public sealed interface UntypedStatementNode permits org.zwobble.hobgoblin.compiler.ast.untyped.UntypedReturnNode {
+ public interface Builder {
+ public org.zwobble.hobgoblin.compiler.ast.untyped.UntypedStatementNode build();
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.ast.untyped.UntypedStatementNode.Builder body
+ // Custom area end: org.zwobble.hobgoblin.compiler.ast.untyped.UntypedStatementNode.Builder body
+ }
+
+ // Custom area start: org.zwobble.hobgoblin.compiler.ast.untyped.UntypedStatementNode body
+ // Custom area end: org.zwobble.hobgoblin.compiler.ast.untyped.UntypedStatementNode body
+}
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 e15e97a..7200ebd 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java
@@ -458,6 +458,29 @@ public class Parser {
);
}
+ // == Statements ==
+
+ static UntypedStatementNode parseStatement(TokenIterator tokens) {
+ if (tokens.isNext(TokenType.IDENTIFIER, "return")) {
+ return parseReturn(tokens);
+ } else {
+ throw new UnsupportedOperationException("TODO");
+ }
+ }
+
+ private static UntypedReturnNode parseReturn(TokenIterator tokens) {
+ var start = tokens.startPosition();
+
+ tokens.skip(TokenType.IDENTIFIER, "return");
+ var expression = parseTopLevelExpression(tokens);
+ tokens.skip(TokenType.SYMBOL_SEMICOLON);
+
+ var end = tokens.endPosition();
+ var source = createSource(start, end);
+
+ return new UntypedReturnNode(expression, source);
+ }
+
// == Expressions ==
static UntypedExpressionNode parseTopLevelExpression(TokenIterator tokens) {