diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-06 19:55:11 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-06 19:55:11 +0100 |
| commit | ab8b25ab08620df482d88c0e729fb9f53bca9f61 (patch) | |
| tree | 768b257c221355f79a70d65874f384491f8237fd /src/main/java | |
| parent | 76fb53ae402d869df06a5b2652e7891865e247b3 (diff) | |
Parse positional arguments
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/parser/Parser.java | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java index 6f5abb19..47c9d286 100644 --- a/src/main/java/org/shedlang/compiler/parser/Parser.java +++ b/src/main/java/org/shedlang/compiler/parser/Parser.java @@ -5,7 +5,10 @@ import org.shedlang.compiler.sources.Source; import org.shedlang.compiler.tokeniser.TokenIterator; import org.shedlang.compiler.tokeniser.UnexpectedTokenException; +import java.util.ArrayList; import java.util.List; +import java.util.function.BooleanSupplier; +import java.util.function.Supplier; import java.util.regex.Pattern; public class Parser { @@ -28,7 +31,36 @@ public class Parser { } private static UntypedArgsNode parseArgs(TokenIterator<TokenType> tokens) { - return new UntypedArgsNode(List.of(), List.of(), tokens.position()); + var start = tokens.position(); + + var positional = parseMany( + () -> tokens.isNext(TokenType.SYMBOL_PAREN_CLOSE), + () -> parseTopLevelExpression(tokens), + () -> tokens.trySkip(TokenType.SYMBOL_COMMA) + ); + + var end = tokens.position(); + var source = start.to(end); + + return new UntypedArgsNode(positional, List.of(), source); + } + + 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 UntypedExpressionNode parsePrimaryExpression(TokenIterator<TokenType> tokens) { |
