feat: for step 步长 — for i in 0 to 10 step 2 { ... }
Token(75): +TOK_STEP, desugar_for 增加 step_expr 参数, 默认 step=1 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -39,25 +39,23 @@ AstNode* desugar_guard(Parser* p, const Token* guard_tok,
|
||||
return ast_make_if(p->arena, not_cond, body, NULL, tok_loc(guard_tok));
|
||||
}
|
||||
|
||||
// === for i in start to end { body } → { var i = start; while i < end { body; i = i + 1; } } ===
|
||||
// === for i in start to end [step N] { body } → { var i=start; while i<end { body; i=i+step; } } ===
|
||||
AstNode* desugar_for(Parser* p, const Token* for_tok,
|
||||
const char* var_name, AstNode* start_expr,
|
||||
AstNode* end_expr, AstNode* body) {
|
||||
// var i = start;
|
||||
AstNode* end_expr, AstNode* step_expr, AstNode* body) {
|
||||
AstNode* let_stmt = ast_make_let(p->arena, var_name, TYPE_UNKNOWN,
|
||||
false, true, start_expr, NULL, 0, NULL, 0, tok_loc(for_tok));
|
||||
|
||||
// i < end
|
||||
AstNode* cond = ast_make_binary(p->arena, OP_LT,
|
||||
ast_make_ident(p->arena, var_name, tok_loc(for_tok)),
|
||||
end_expr, tok_loc(for_tok));
|
||||
|
||||
// i = i + 1
|
||||
AstNode* step = step_expr ? step_expr
|
||||
: ast_make_literal_i64(p->arena, 1, tok_loc(for_tok));
|
||||
AstNode* incr = ast_make_assign(p->arena, var_name,
|
||||
ast_make_binary(p->arena, OP_ADD,
|
||||
ast_make_ident(p->arena, var_name, tok_loc(for_tok)),
|
||||
ast_make_literal_i64(p->arena, 1, tok_loc(for_tok)),
|
||||
tok_loc(for_tok)),
|
||||
step, tok_loc(for_tok)),
|
||||
tok_loc(for_tok));
|
||||
|
||||
// 增量追加到循环体末尾
|
||||
|
||||
Reference in New Issue
Block a user