diff options
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java | 36 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenIterator.java | 4 |
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)) { |
