added parsing and testing for grouped expressions
This commit is contained in:
@@ -46,6 +46,11 @@ namespace parser {
|
|||||||
std::bind(&parser::parse_boolean, this)
|
std::bind(&parser::parse_boolean, this)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
register_prefix(
|
||||||
|
token::type::LPAREN,
|
||||||
|
std::bind(&parser::parse_grouped_expr, this)
|
||||||
|
);
|
||||||
|
|
||||||
using namespace std::placeholders;
|
using namespace std::placeholders;
|
||||||
register_infix(
|
register_infix(
|
||||||
{token::type::PLUS,
|
{token::type::PLUS,
|
||||||
@@ -238,6 +243,19 @@ namespace parser {
|
|||||||
return ret;
|
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) {
|
ast::expression* parser::parse_infix_expr(ast::expression* left) {
|
||||||
// TRACE_FUNCTION;
|
// TRACE_FUNCTION;
|
||||||
ast::infix_expr* ret =
|
ast::infix_expr* ret =
|
||||||
|
@@ -53,6 +53,7 @@ namespace parser {
|
|||||||
ast::expression* parse_integer();
|
ast::expression* parse_integer();
|
||||||
ast::expression* parse_boolean();
|
ast::expression* parse_boolean();
|
||||||
ast::expression* parse_prefix_expr();
|
ast::expression* parse_prefix_expr();
|
||||||
|
ast::expression* parse_grouped_expr();
|
||||||
|
|
||||||
ast::expression* parse_infix_expr(ast::expression*);
|
ast::expression* parse_infix_expr(ast::expression*);
|
||||||
};
|
};
|
||||||
|
@@ -236,6 +236,11 @@ TEST_SUITE("Parser: expression") {
|
|||||||
"((3 + (4 * 5)) == ((3 * 1) + (4 * 5)))"},
|
"((3 + (4 * 5)) == ((3 * 1) + (4 * 5)))"},
|
||||||
{"3 > 5 == false", "((3 > 5) == false)"},
|
{"3 > 5 == false", "((3 > 5) == false)"},
|
||||||
{"3 < 5 == true", "((3 < 5) == true)"},
|
{"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) {
|
for (auto& t : tests) {
|
||||||
|
Reference in New Issue
Block a user