diff --git a/src/parser/parser.cpp b/src/parser/parser.cpp index c7466a8..5538a4b 100644 --- a/src/parser/parser.cpp +++ b/src/parser/parser.cpp @@ -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 = diff --git a/src/parser/parser.hpp b/src/parser/parser.hpp index 7121eb9..df33cf1 100644 --- a/src/parser/parser.hpp +++ b/src/parser/parser.hpp @@ -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*); }; diff --git a/test/parser/expression.cpp b/test/parser/expression.cpp index 8b80856..3931bb7 100644 --- a/test/parser/expression.cpp +++ b/test/parser/expression.cpp @@ -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) {