From da7a0df7a18b209e3c10c948d9684104994639a5 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 25 Aug 2021 11:43:02 +0100 Subject: Simplify logic for `parse_binary_expr` --- src/parser.cpp | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) (limited to 'src/parser.cpp') 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; -- cgit v1.2.3