Simplify logic for parse_binary_expr

This commit is contained in:
gingerBill
2021-08-25 11:43:02 +01:00
parent fcbd94b924
commit da7a0df7a1
+14 -13
View File
@@ -2986,31 +2986,32 @@ Ast *parse_binary_expr(AstFile *f, bool lhs, i32 prec_in) {
Token token_c = expect_token(f, Token_Colon); Token token_c = expect_token(f, Token_Colon);
Ast *y = parse_expr(f, lhs); Ast *y = parse_expr(f, lhs);
expr = ast_ternary_if_expr(f, x, cond, y); expr = ast_ternary_if_expr(f, x, cond, y);
} else if (op.kind == Token_if) { } else if (op.kind == Token_if || op.kind == Token_when) {
Ast *x = expr; Ast *x = expr;
// Token_if
Ast *cond = parse_expr(f, lhs); Ast *cond = parse_expr(f, lhs);
Token tok_else = expect_token(f, Token_else); Token tok_else = expect_token(f, Token_else);
Ast *y = parse_expr(f, lhs); Ast *y = parse_expr(f, lhs);
switch (op.kind) {
case Token_if:
expr = ast_ternary_if_expr(f, x, cond, y); expr = ast_ternary_if_expr(f, x, cond, y);
} else if (op.kind == Token_when) { break;
Ast *x = expr; case Token_when:
// Token_when
Ast *cond = parse_expr(f, lhs);
Token tok_else = expect_token(f, Token_else);
Ast *y = parse_expr(f, lhs);
expr = ast_ternary_when_expr(f, x, cond, y); expr = ast_ternary_when_expr(f, x, cond, y);
} else if (op.kind == Token_or_else) { break;
Ast *x = expr; }
Ast *y = parse_expr(f, lhs);
expr = ast_or_else_expr(f, x, op, y);
} else { } else {
Ast *right = parse_binary_expr(f, false, prec+1); Ast *right = parse_binary_expr(f, false, prec+1);
if (right == nullptr) { if (right == nullptr) {
syntax_error(op, "Expected expression on the right-hand side of the binary operator"); syntax_error(op, "Expected expression on the right-hand side of the binary operator '%.*s'", LIT(op.string));
} }
if (op.kind == Token_or_else) {
// NOTE(bill): easier to handle its logic different with its own AST kind
expr = ast_or_else_expr(f, expr, op, right);
} else {
expr = ast_binary_expr(f, op, expr, right); expr = ast_binary_expr(f, op, expr, right);
} }
}
lhs = false; lhs = false;
} }