From 4d9b8c3aac9c89343e9e80a0ee12c5e4b536baef Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sun, 4 May 2025 20:22:36 +0900 Subject: var decl with initial expr --- main.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) (limited to 'main.c') diff --git a/main.c b/main.c index 633ebdb..d57cac3 100644 --- a/main.c +++ b/main.c @@ -1099,10 +1099,13 @@ struct AstNode* parse_var_decl(struct Parser* p) { fatal_error("parse_var_decl: invalid type for variable"); } char* name = parse_ident(p); - struct AstNode* decl = ast_new(AST_VAR_DECL); + + struct AstNode* init = NULL; + if (peek_token(p)->kind == TK_ASSIGN) { + next_token(p); + init = parse_expr(p); + } expect(p, TK_SEMICOLON); - decl->ty = ty; - decl->name = name; if (find_lvar(p, name) != -1) { char buf[1024]; @@ -1113,7 +1116,20 @@ struct AstNode* parse_var_decl(struct Parser* p) { p->locals[p->n_locals].ty = ty; p->n_locals = p->n_locals + 1; - return decl; + struct AstNode* ret; + if (init) { + struct AstNode* lhs = ast_new(AST_LVAR); + lhs->name = name; + lhs->var_index = p->n_locals - 1; + lhs->ty = ty; + struct AstNode* assign = ast_new_assign_expr(TK_ASSIGN, lhs, init); + assign->ty = ty; + ret = ast_new(AST_EXPR_STMT); + ret->expr1 = assign; + } else { + ret = ast_new(AST_VAR_DECL); + } + return ret; } struct AstNode* parse_expr_stmt(struct Parser* p) { -- cgit v1.2.3-70-g09d2