diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-12-26 17:18:50 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-12-26 17:18:50 +0000 |
| commit | d4d8c8bc13a4d2b11f87a474930349c17afab2b1 (patch) | |
| tree | 1d03e0326b717ee1362a0742f33c71b0fe3731e8 /src/main/java | |
| parent | df6ec9c9606184b472fc3d7278e2a50fb32c1479 (diff) | |
Parse type level args for calls
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/parser/Parser.java | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java index 96b06c50..aed9d79d 100644 --- a/src/main/java/org/shedlang/compiler/parser/Parser.java +++ b/src/main/java/org/shedlang/compiler/parser/Parser.java @@ -202,7 +202,11 @@ public class Parser { @Override public Stream<TokenType> operatorTokenTypes() { - return Stream.of(TokenType.SYMBOL_BANG, TokenType.SYMBOL_PAREN_OPEN); + return Stream.of( + TokenType.SYMBOL_BANG, + TokenType.SYMBOL_PAREN_OPEN, + TokenType.SYMBOL_SQUARE_OPEN + ); } @Override @@ -211,6 +215,8 @@ public class Parser { var hasEffects = tokens.trySkip(TokenType.SYMBOL_BANG); + var typeLevelArgs = parseTypeLevelArgsOptional(tokens); + tokens.skip(TokenType.SYMBOL_PAREN_OPEN); var args = parseArgs(tokens); tokens.skip(TokenType.SYMBOL_PAREN_CLOSE); @@ -220,7 +226,7 @@ public class Parser { return new UntypedCallNode( left, - Optional.empty(), + typeLevelArgs, args, hasEffects, source @@ -1264,6 +1270,24 @@ public class Parser { return new UntypedTupleTypeNode(elements, source); } + private static Optional<List<UntypedTypeLevelExpressionNode>> parseTypeLevelArgsOptional( + TokenIterator<TokenType> tokens + ) { + if (tokens.trySkip(TokenType.SYMBOL_SQUARE_OPEN)) { + var params = parseMany( + () -> tokens.isNext(TokenType.SYMBOL_SQUARE_CLOSE), + () -> parseTopLevelTypeLevelExpression(tokens), + () -> tokens.trySkip(TokenType.SYMBOL_COMMA) + ); + + tokens.skip(TokenType.SYMBOL_SQUARE_CLOSE); + + return Optional.of(params); + } else { + return Optional.empty(); + } + } + private static final Map<TokenType, OperationParser<TypeLevelOperatorPrecedence, UntypedTypeLevelExpressionNode>> TYPE_LEVEL_OPERATION_PARSERS = Stream.of( new ConstructedTypeParser() ) |
