aboutsummaryrefslogtreecommitdiff
path: root/src/parser.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-08-25 11:43:02 +0100
committergingerBill <bill@gingerbill.org>2021-08-25 11:43:02 +0100
commitda7a0df7a18b209e3c10c948d9684104994639a5 (patch)
tree8daf3edf4a9160053f4a19cb53da31979a65b851 /src/parser.cpp
parentfcbd94b924ca4e413fcd47aad97c6a9b3ef2e43e (diff)
Simplify logic for `parse_binary_expr`
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp33
1 files changed, 17 insertions, 16 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index 78aa48dcb..880e92273 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -2986,30 +2986,31 @@ Ast *parse_binary_expr(AstFile *f, bool lhs, i32 prec_in) {
Token token_c = expect_token(f, Token_Colon);
Ast *y = parse_expr(f, lhs);
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;
- // Token_if
Ast *cond = parse_expr(f, lhs);
Token tok_else = expect_token(f, Token_else);
Ast *y = parse_expr(f, lhs);
- expr = ast_ternary_if_expr(f, x, cond, y);
- } else if (op.kind == Token_when) {
- Ast *x = expr;
- // 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);
- } 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);
+
+ switch (op.kind) {
+ case Token_if:
+ expr = ast_ternary_if_expr(f, x, cond, y);
+ break;
+ case Token_when:
+ expr = ast_ternary_when_expr(f, x, cond, y);
+ break;
+ }
} else {
Ast *right = parse_binary_expr(f, false, prec+1);
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;