feat: 表达式作为值 — if/else 和 block 可产生值
This commit is contained in:
+17
-1
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user