diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-05-30 17:27:25 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-05-30 17:27:25 +0100 |
| commit | 88d38e052ba46a2e3d151c0708287c7956a9f9c1 (patch) | |
| tree | 79cdbdb07901c3e94f68437fdbee4e72492f45d4 /src/main/java | |
| parent | 57ff00acc01cf5082601cd00a125afa02fa3cba8 (diff) | |
Support parsing namespace name
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java | 26 |
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 |
