aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-01-09 01:31:03 +0900
committernsfisis <nsfisis@gmail.com>2026-01-09 01:32:18 +0900
commitc40c49de2c318ded0aa127e5faccc9054df6e30e (patch)
tree13db534b6a417049cb104b72907aa7c139d3bb4c /src
parent1e89f9ff938ed458e8be8904bb29b7ced406f9d5 (diff)
downloadducc-c40c49de2c318ded0aa127e5faccc9054df6e30e.tar.gz
ducc-c40c49de2c318ded0aa127e5faccc9054df6e30e.tar.zst
ducc-c40c49de2c318ded0aa127e5faccc9054df6e30e.zip
feat: support declarations to declare multiple members at once
Diffstat (limited to 'src')
-rw-r--r--src/parse.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/src/parse.c b/src/parse.c
index 195a3b0..a9ecbe8 100644
--- a/src/parse.c
+++ b/src/parse.c
@@ -1515,24 +1515,23 @@ static AstNode* parse_member_declaration(Parser* p) {
expect(p, TokenKind_semicolon);
- if (decls->node_len != 1)
- unimplemented();
-
- AstNode* m = ast_new(AstNodeKind_struct_member);
- m->name = decls->node_items[0].name;
- m->ty = decls->node_items[0].ty;
- return m;
+ for (size_t i = 0; i < decls->node_len; i++) {
+ decls->node_items[i].kind = AstNodeKind_struct_member;
+ }
+ return decls;
}
// member-declaration-list:
// { member-declaration }+
static AstNode* parse_member_declaration_list(Parser* p) {
- AstNode* list = ast_new_list(4);
+ AstNode* members = ast_new_list(4);
while (peek_token(p)->kind != TokenKind_brace_r) {
- AstNode* member = parse_member_declaration(p);
- ast_append(list, member);
+ AstNode* decls = parse_member_declaration(p);
+ for (size_t i = 0; i < decls->node_len; i++) {
+ ast_append(members, &decls->node_items[i]);
+ }
}
- return list;
+ return members;
}
static AstNode* parse_enum_member(Parser* p) {