aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-06 19:55:11 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-06 19:55:11 +0100
commitab8b25ab08620df482d88c0e729fb9f53bca9f61 (patch)
tree768b257c221355f79a70d65874f384491f8237fd /src/main/java
parent76fb53ae402d869df06a5b2652e7891865e247b3 (diff)
Parse positional arguments
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java34
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) {