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;
|
m = m->next;
|
||||||
}
|
}
|
||||||
break;
|
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:
|
case NODE_IF:
|
||||||
printf("IfStmt (Fields missing in struct)\n");
|
printf("IfStmt (Fields missing in struct)\n");
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
10
parser.c
10
parser.c
|
|
@ -684,6 +684,10 @@ static member *parse_member(parser *p)
|
||||||
if (match(p, TOKEN_STRUCT)) {
|
if (match(p, TOKEN_STRUCT)) {
|
||||||
type = parse_struct(p);
|
type = parse_struct(p);
|
||||||
}
|
}
|
||||||
|
if (match(p, TOKEN_UNION)) {
|
||||||
|
type = parse_struct(p);
|
||||||
|
type->type = NODE_UNION;
|
||||||
|
}
|
||||||
if (!type) {
|
if (!type) {
|
||||||
type = parse_factor(p);
|
type = parse_factor(p);
|
||||||
if (!type) {
|
if (!type) {
|
||||||
|
|
@ -899,6 +903,12 @@ static ast_node *parse_statement(parser *p)
|
||||||
{
|
{
|
||||||
return parse_struct(p);
|
return parse_struct(p);
|
||||||
}
|
}
|
||||||
|
else if (match(p, TOKEN_UNION))
|
||||||
|
{
|
||||||
|
ast_node *u = parse_struct(p);
|
||||||
|
u->type = NODE_UNION;
|
||||||
|
return u;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ast_node *expr = parse_expression(p);
|
ast_node *expr = parse_expression(p);
|
||||||
|
|
|
||||||
2
test.c
2
test.c
|
|
@ -1,4 +1,4 @@
|
||||||
struct {
|
struct {
|
||||||
struct { u32 x, u32 y } a,
|
union { u32 x, u32 y } a,
|
||||||
u32 b,
|
u32 b,
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue