implemented if statement parsing

This commit is contained in:
Lorenzo Torres 2025-12-03 10:12:07 +01:00
parent d6d2230f14
commit c34bea6fff
3 changed files with 19 additions and 4 deletions

4
lc.c
View file

@ -151,7 +151,9 @@ void print_ast(ast_node *node, int depth) {
}
break;
case NODE_IF:
printf("IfStmt (Fields missing in struct)\n");
printf("If:\n");
print_ast(node->expr.whle.condition, depth + 1);
print_ast(node->expr.whle.body, depth + 1);
break;
case NODE_VAR_DECL:
printf("VarDecl: %.*s: %.*s\n", (int)node->expr.var_decl.name_len, node->expr.var_decl.name, (int)node->expr.var_decl.type_len, node->expr.var_decl.type);

View file

@ -676,6 +676,17 @@ static ast_node *parse_while(parser *p)
return node;
}
static ast_node *parse_if(parser *p)
{
ast_node *condition = parse_expression(p);
ast_node *body = parse_compound(p);
ast_node *node = arena_alloc(p->allocator, sizeof(ast_node));
node->type = NODE_IF;
node->expr.whle.body = body;
node->expr.whle.condition = condition;
return node;
}
static ast_node *parse_struct(parser *p);
static member *parse_member(parser *p)
{
@ -874,6 +885,9 @@ static ast_node *parse_statement(parser *p)
return parse_while(p);
}
}
else if (match(p, TOKEN_IF)) {
return parse_if(p);
}
else if (match_peek(p, TOKEN_IDENTIFIER) && p->tokens->next && p->tokens->next->type == TOKEN_IDENTIFIER)
{
/* Variable declaration. */

5
test.c
View file

@ -1,4 +1,3 @@
struct {
union { u32 x, u32 y } a,
u32 b,
if a == x {
printf("hello");
}