From ab8b25ab08620df482d88c0e729fb9f53bca9f61 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 6 Jun 2023 19:55:11 +0100 Subject: Parse positional arguments --- .../java/org/shedlang/compiler/parser/Parser.java | 34 +++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) (limited to 'src/main/java') 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 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 List parseMany( + BooleanSupplier stop, + Supplier parseOne, + BooleanSupplier parseSeparator + ) { + var values = new ArrayList(); + + while (!stop.getAsBoolean()) { + var value = parseOne.get(); + values.add(value); + if (!parseSeparator.getAsBoolean()) { + return values; + } + } + + return values; } private static UntypedExpressionNode parsePrimaryExpression(TokenIterator tokens) { -- cgit v1.2.3