diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-09-27 20:28:09 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-09-27 20:28:09 +0100 |
| commit | 059d6276a4d2ef23672adb009e633a06f3603a8c (patch) | |
| tree | 162ba95c15b2ed66c323be4c2225c4b096313dfc /src/main/java | |
| parent | a0074f328bfabc0c28d7e5b1202761daaa265fc8 (diff) | |
Parse struct definition fields
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/parser/Parser.java | 23 |
1 files changed, 22 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 2bda39ed..e3c78d07 100644 --- a/src/main/java/org/shedlang/compiler/parser/Parser.java +++ b/src/main/java/org/shedlang/compiler/parser/Parser.java @@ -567,6 +567,11 @@ public class Parser { var name = tokens.nextValue(TokenType.IDENTIFIER); tokens.skip(TokenType.SYMBOL_PAREN_OPEN); + var fields = parseMany( + () -> tokens.isNext(TokenType.SYMBOL_PAREN_CLOSE), + () -> parseStructFieldDefinition(tokens), + () -> tokens.trySkip(TokenType.SYMBOL_COMMA) + ); tokens.skip(TokenType.SYMBOL_PAREN_CLOSE); tokens.skip(TokenType.SYMBOL_BRACE_OPEN); @@ -575,7 +580,23 @@ public class Parser { var end = tokens.position(); var source = start.to(end); - return new UntypedStructDefinitionNode(name, List.of(), source); + return new UntypedStructDefinitionNode(name, fields, source); + } + + private static UntypedStructFieldDefinitionNode parseStructFieldDefinition(TokenIterator<TokenType> tokens) { + var start = tokens.position(); + + tokens.skip(TokenType.SYMBOL_DOT); + var name = tokens.nextValue(TokenType.IDENTIFIER); + + tokens.skip(TokenType.SYMBOL_COLON); + + var type = parseTopLevelTypeLevelExpression(tokens); + + var end = tokens.position(); + var source = start.to(end); + + return new UntypedStructFieldDefinitionNode(name, type, source); } static UntypedExpressionNode parseSubExpression(TokenIterator<TokenType> tokens, OperatorPrecedence parentPrecedence) { |
