implemented union parsing

This commit is contained in:
Lorenzo Torres 2025-12-03 10:04:11 +01:00
parent 664affc6d3
commit d6d2230f14
3 changed files with 19 additions and 1 deletions

8
lc.c
View file

@ -142,6 +142,14 @@ void print_ast(ast_node *node, int depth) {
m = m->next;
}
break;
case NODE_UNION:
printf("Union: %.*s\n", (int)node->expr.structure.name_len, node->expr.structure.name);
m = node->expr.structure.members;
while (m) {
print_ast(m->type, depth + 1);
m = m->next;
}
break;
case NODE_IF:
printf("IfStmt (Fields missing in struct)\n");
break;

View file

@ -684,6 +684,10 @@ static member *parse_member(parser *p)
if (match(p, TOKEN_STRUCT)) {
type = parse_struct(p);
}
if (match(p, TOKEN_UNION)) {
type = parse_struct(p);
type->type = NODE_UNION;
}
if (!type) {
type = parse_factor(p);
if (!type) {
@ -899,6 +903,12 @@ static ast_node *parse_statement(parser *p)
{
return parse_struct(p);
}
else if (match(p, TOKEN_UNION))
{
ast_node *u = parse_struct(p);
u->type = NODE_UNION;
return u;
}
else
{
ast_node *expr = parse_expression(p);

2
test.c
View file

@ -1,4 +1,4 @@
struct {
struct { u32 x, u32 y } a,
union { u32 x, u32 y } a,
u32 b,
}