diff --git a/lc.c b/lc.c index e4038c9..d8e8426 100644 --- a/lc.c +++ b/lc.c @@ -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); diff --git a/parser.c b/parser.c index 7303013..02029d7 100644 --- a/parser.c +++ b/parser.c @@ -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. */ diff --git a/test.c b/test.c index 4dd7f07..3aebb36 100644 --- a/test.c +++ b/test.c @@ -1,4 +1,3 @@ -struct { - union { u32 x, u32 y } a, - u32 b, +if a == x { + printf("hello"); }