feat: 表达式作为值 — if/else 和 block 可产生值

This commit is contained in:
2026-06-06 13:52:36 +08:00
parent 380b52930a
commit 0ec3c3d65f
4 changed files with 99 additions and 1 deletions
+17 -1
View File
@@ -258,7 +258,23 @@ static AstNode* parse_expr_prec(Parser* p, Precedence min_prec, ErrorInfo* error
AstNode* left = NULL;
// 前缀解析
if (tok->kind == TOK_MINUS || tok->kind == TOK_BANG) {
if (tok->kind == TOK_IF) {
// if-expr: if cond { then } else { else } → AST_IF_STMT (表达式位置)
const Token* if_tok = advance(p);
AstNode* cond = parse_expr(p, error);
if (!cond) return NULL;
AstNode* then_block = parse_block(p, error);
if (!then_block) return NULL;
AstNode* else_block = NULL;
if (match(p, TOK_ELSE)) {
if (peek(p)->kind == TOK_IF)
else_block = parse_expr_prec(p, min_prec, error); // else if
else
else_block = parse_block(p, error);
if (!else_block) return NULL;
}
left = ast_make_if(p->arena, cond, then_block, else_block, tok_loc(if_tok));
} else if (tok->kind == TOK_MINUS || tok->kind == TOK_BANG) {
left = parse_unary(p, error);
} else if (tok->kind == TOK_LPAREN) {
left = parse_group(p, error);