aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-09-27 20:28:09 +0100
committerMichael Williamson <mike@zwobble.org>2023-09-27 20:28:09 +0100
commit059d6276a4d2ef23672adb009e633a06f3603a8c (patch)
tree162ba95c15b2ed66c323be4c2225c4b096313dfc /src/main/java
parenta0074f328bfabc0c28d7e5b1202761daaa265fc8 (diff)
Parse struct definition fields
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java23
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) {