summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-04-23 11:24:44 +0100
committerMichael Williamson <mike@zwobble.org>2026-04-23 11:24:44 +0100
commit9097b3ac138a60f6e7c708d2b452f95eb75601cb (patch)
treede0920ba9b0e50dd7450b4611c9d92c55a80d542 /src/main/java
parent45f5de758c0b1b2fc1ab019750a5db176a5423bf (diff)
Parse namespace body
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java36
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenIterator.java4
2 files changed, 39 insertions, 1 deletions
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 53a852e..106a101 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java
@@ -6,7 +6,10 @@ import org.zwobble.hobgoblin.compiler.sources.Source;
import org.zwobble.hobgoblin.compiler.types.NamespaceName;
import org.zwobble.sourcetext.SourcePosition;
+import java.util.ArrayList;
import java.util.List;
+import java.util.function.BooleanSupplier;
+import java.util.function.Supplier;
public class Parser {
private Parser() {
@@ -18,12 +21,18 @@ public class Parser {
) {
var start = tokens.startPosition();
+ var body = parseMany(
+ () -> tokens.isNext(TokenType.END),
+ () -> parseNamespaceStatement(tokens),
+ () -> true
+ );
+
var end = tokens.endPosition();
var source = createSource(start, end);
return new UntypedNamespaceNode(
namespaceName,
- List.of(),
+ body,
source
);
}
@@ -63,6 +72,31 @@ public class Parser {
);
}
+ /**
+ * Parse zero, one, or many instances of {@code T} using {@code parseOne}.
+ * Each instance is expected to be separated by tokens consumed by
+ * {@code parseSeparator}. Parsing stops either if {@code parseSeparator}
+ * returns false, or if {@code stop} returns false. Trailing separators
+ * are permitted.
+ */
+ private static <T> List<T> parseMany(
+ BooleanSupplier stop,
+ Supplier<T> parseOne,
+ BooleanSupplier parseSeparator
+ ) {
+ var values = new ArrayList<T>();
+
+ while (!stop.getAsBoolean()) {
+ var value = parseOne.get();
+ values.add(value);
+ if (!parseSeparator.getAsBoolean()) {
+ return values;
+ }
+ }
+
+ return values;
+ }
+
private static Source createSource(SourcePosition start, SourcePosition end) {
return new FileFragmentSource(start.to(end));
}
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 4479043..a66ec35 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenIterator.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenIterator.java
@@ -19,6 +19,10 @@ public class TokenIterator {
return this.getAbsolute(this.tokenIndex);
}
+ public boolean isNext(TokenType tokenType) {
+ return this.peek().tokenType().equals(tokenType);
+ }
+
public Token next(TokenType tokenType) {
var token = peek();
if (token.tokenType().equals(tokenType)) {