From 059d6276a4d2ef23672adb009e633a06f3603a8c Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 27 Sep 2023 20:28:09 +0100 Subject: Parse struct definition fields --- .../java/org/shedlang/compiler/parser/Parser.java | 23 +++++++++++++++++++++- 1 file changed, 22 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 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 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 tokens, OperatorPrecedence parentPrecedence) { -- cgit v1.2.3