From 88d38e052ba46a2e3d151c0708287c7956a9f9c1 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 30 May 2026 17:27:25 +0100 Subject: Support parsing namespace name --- .../zwobble/hobgoblin/compiler/parser/Parser.java | 26 ++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) (limited to 'src/main') 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 -- cgit v1.2.3