mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 15:48:51 +00:00
Simplify logic for parse_binary_expr
This commit is contained in:
+17
-16
@@ -2986,30 +2986,31 @@ 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);
|
||||||
expr = ast_ternary_if_expr(f, x, cond, y);
|
|
||||||
} else if (op.kind == Token_when) {
|
switch (op.kind) {
|
||||||
Ast *x = expr;
|
case Token_if:
|
||||||
// Token_when
|
expr = ast_ternary_if_expr(f, x, cond, y);
|
||||||
Ast *cond = parse_expr(f, lhs);
|
break;
|
||||||
Token tok_else = expect_token(f, Token_else);
|
case Token_when:
|
||||||
Ast *y = parse_expr(f, lhs);
|
expr = ast_ternary_when_expr(f, x, cond, y);
|
||||||
expr = ast_ternary_when_expr(f, x, cond, y);
|
break;
|
||||||
} else if (op.kind == Token_or_else) {
|
}
|
||||||
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;
|
||||||
|
|||||||
Reference in New Issue
Block a user