summaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-05-30 17:27:25 +0100
committerMichael Williamson <mike@zwobble.org>2026-05-30 17:27:25 +0100
commit88d38e052ba46a2e3d151c0708287c7956a9f9c1 (patch)
tree79cdbdb07901c3e94f68437fdbee4e72492f45d4 /src/main/java/org/zwobble
parent57ff00acc01cf5082601cd00a125afa02fa3cba8 (diff)
Support parsing namespace name
Diffstat (limited to 'src/main/java/org/zwobble')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java26
1 files changed, 24 insertions, 2 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 f995ef3..05c429d 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java
@@ -228,17 +228,39 @@ public class Parser {
private static UntypedTypeLevelReferenceNode parsePrimaryTypeLevelExpression(TokenIterator tokens) {
var start = tokens.startPosition();
- var name = tokens.next(TokenType.IDENTIFIER);
+ var name = parseIdentifier(tokens);
var end = tokens.endPosition();
var source = createSource(start, end);
return new UntypedTypeLevelReferenceNode(
- name.charSequence().toString(),
+ name,
source
);
}
+ public static NamespaceName parseNamespaceName(SourceText sourceText) {
+ var tokens = Tokenizer.tokenize(sourceText);
+ var tokenIterator = tokens.iterator();
+ var namespaceName = parseNamespaceName(tokenIterator);
+ tokenIterator.skip(TokenType.END);
+ return namespaceName;
+ }
+
+ static NamespaceName parseNamespaceName(TokenIterator tokens) {
+ var namespaceParts = parseMany(
+ () -> !tokens.isNext(TokenType.IDENTIFIER),
+ () -> parseIdentifier(tokens),
+ () -> tokens.trySkip(TokenType.SYMBOL_FORWARD_SLASH)
+ );
+
+ return new NamespaceName(namespaceParts);
+ }
+
+ private static String parseIdentifier(TokenIterator tokens) {
+ return tokens.next(TokenType.IDENTIFIER).charSequence().toString();
+ }
+
/**
* Parse zero, one, or many instances of {@code T} using {@code parseOne}.
* Each instance is expected to be separated by tokens consumed by