implemented union parsing
This commit is contained in:
parent
664affc6d3
commit
d6d2230f14
3 changed files with 19 additions and 1 deletions
8
lc.c
8
lc.c
|
|
@ -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;
|
||||
|
|
|
|||
10
parser.c
10
parser.c
|
|
@ -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
2
test.c
|
|
@ -1,4 +1,4 @@
|
|||
struct {
|
||||
struct { u32 x, u32 y } a,
|
||||
union { u32 x, u32 y } a,
|
||||
u32 b,
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue