feat: let mut 改为 var 关键字声明可变变量
This commit is contained in:
+7
-8
@@ -472,11 +472,10 @@ static AstNode* parse_block(Parser* p, ErrorInfo* error) {
|
||||
static AstNode* parse_statement(Parser* p, ErrorInfo* error) {
|
||||
const Token* t = peek(p);
|
||||
|
||||
if (t->kind == TOK_LET) {
|
||||
advance(p);
|
||||
bool is_mut = false;
|
||||
if (peek(p)->kind == TOK_MUT) { is_mut = true; advance(p); }
|
||||
const Token* name = expect(p, TOK_IDENT, error, "let 后应为变量名");
|
||||
if (t->kind == TOK_LET || t->kind == TOK_VAR) {
|
||||
bool is_mut = (advance(p)->kind == TOK_VAR);
|
||||
const Token* name = expect(p, TOK_IDENT, error,
|
||||
is_mut ? "var 后应为变量名" : "let 后应为变量名");
|
||||
if (!name) return NULL;
|
||||
// 可选的类型标注
|
||||
TypeKind annot_type = TYPE_UNKNOWN;
|
||||
@@ -558,11 +557,11 @@ static AstNode* parse_statement(Parser* p, ErrorInfo* error) {
|
||||
if (!body) return NULL;
|
||||
|
||||
// 脱糖: for i in start to end { body; }
|
||||
// → { let mut i = start; while i < end { body; i = i + 1; } }
|
||||
// → { var i = start; while i < end { body; i = i + 1; } }
|
||||
|
||||
const char* vname = arena_strdup_impl(p->arena, var_name->start, var_name->length);
|
||||
|
||||
// 构建: let mut i = start;
|
||||
// 构建: var i = start;
|
||||
AstNode* let_stmt = ast_make_let(p->arena, vname, TYPE_UNKNOWN, false, true, start_expr, NULL, 0, NULL, 0, tok_loc(var_name));
|
||||
|
||||
// 构建: i < end (while 条件)
|
||||
@@ -589,7 +588,7 @@ static AstNode* parse_statement(Parser* p, ErrorInfo* error) {
|
||||
// 构建: while i < end { ... body ... ; i = i + 1; }
|
||||
AstNode* while_loop = ast_make_while(p->arena, cond, new_body, tok_loc(t));
|
||||
|
||||
// 包装: { let mut i = start; while i < end { ... } }
|
||||
// 包装: { var i = start; while i < end { ... } }
|
||||
AstNode* stmts_arr[2] = { let_stmt, while_loop };
|
||||
AstNode** stmts = arena_alloc_impl(p->arena, 2 * sizeof(AstNode*));
|
||||
memcpy(stmts, stmts_arr, 2 * sizeof(AstNode*));
|
||||
|
||||
Reference in New Issue
Block a user