added parsing and testing for grouped expressions
This commit is contained in:
@@ -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 =
|
||||
|
@@ -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*);
|
||||
};
|
||||
|
@@ -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) {
|
||||
|
Reference in New Issue
Block a user