added parsing and testing for grouped expressions

This commit is contained in:
Karma Riuk
2025-07-12 15:22:45 +02:00
parent ab17545c93
commit 86574552aa
3 changed files with 24 additions and 0 deletions

View File

@@ -46,6 +46,11 @@ namespace parser {
std::bind(&parser::parse_boolean, this)
);
register_prefix(
token::type::LPAREN,
std::bind(&parser::parse_grouped_expr, this)
);
using namespace std::placeholders;
register_infix(
{token::type::PLUS,
@@ -238,6 +243,19 @@ namespace parser {
return ret;
};
ast::expression* parser::parse_grouped_expr() {
// TRACE_FUNCTION;
next_token();
ast::expression* ret = parse_expression(precedence::LOWEST);
if (!expect_next(token::type::RPAREN)) {
delete ret;
return nullptr;
}
return ret;
};
ast::expression* parser::parse_infix_expr(ast::expression* left) {
// TRACE_FUNCTION;
ast::infix_expr* ret =

View File

@@ -53,6 +53,7 @@ namespace parser {
ast::expression* parse_integer();
ast::expression* parse_boolean();
ast::expression* parse_prefix_expr();
ast::expression* parse_grouped_expr();
ast::expression* parse_infix_expr(ast::expression*);
};

View File

@@ -236,6 +236,11 @@ TEST_SUITE("Parser: expression") {
"((3 + (4 * 5)) == ((3 * 1) + (4 * 5)))"},
{"3 > 5 == false", "((3 > 5) == false)"},
{"3 < 5 == true", "((3 < 5) == true)"},
{"1 + (2 + 3)", "(1 + (2 + 3))"},
{"(1 + a) * 17", "((1 + a) * 17)"},
{"2 / (5 + 5)", "(2 / (5 + 5))"},
{"-(5 + a)", "(-(5 + a))"},
{"!(true == true)", "(!(true == true))"},
};
for (auto& t : tests) {