From dd48fc5b366397039291256d66f7dfcc569a15b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com> Date: Fri, 17 Sep 2021 11:20:01 +0200 Subject: [PATCH] Fix issue #25 (simplification of unary expressions) Also add a few related tests --- src/language/ast/ASTBuilder.cpp | 2 +- tests/test_ASTBuilder.cpp | 21 ++++++++++++++++--- ...t_BinaryExpressionProcessor_arithmetic.cpp | 6 +++--- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/language/ast/ASTBuilder.cpp b/src/language/ast/ASTBuilder.cpp index a4dc8c822..109ce527c 100644 --- a/src/language/ast/ASTBuilder.cpp +++ b/src/language/ast/ASTBuilder.cpp @@ -74,7 +74,7 @@ struct ASTBuilder::simplify_unary : TAO_PEGTL_NAMESPACE::parse_tree::apply<ASTBu transform(n, st...); } } - } else if (n->children.size() == 2) { + } else if ((n->children.size() == 2) and (n->is_type<language::unary_expression>())) { if (n->children[0]->is_type<language::unary_plus>()) { n = std::move(n->children[1]); transform(n, st...); diff --git a/tests/test_ASTBuilder.cpp b/tests/test_ASTBuilder.cpp index 3ce2855ef..fdcf13315 100644 --- a/tests/test_ASTBuilder.cpp +++ b/tests/test_ASTBuilder.cpp @@ -159,15 +159,30 @@ let s:string; s = "foo"; SECTION("parented expression") { std::string_view data = R"( -(2+3)*6; +(-2)*6; +(-2+3)*6; +(-2+3+5)*6; )"; std::string_view result = R"( (root) + +-(language::multiply_op) + | +-(language::unary_minus) + | | `-(language::integer:2) + | `-(language::integer:6) + +-(language::multiply_op) + | +-(language::plus_op) + | | +-(language::unary_minus) + | | | `-(language::integer:2) + | | `-(language::integer:3) + | `-(language::integer:6) `-(language::multiply_op) +-(language::plus_op) - | +-(language::integer:2) - | `-(language::integer:3) + | +-(language::plus_op) + | | +-(language::unary_minus) + | | | `-(language::integer:2) + | | `-(language::integer:3) + | `-(language::integer:5) `-(language::integer:6) )"; CHECK_AST(data, result); diff --git a/tests/test_BinaryExpressionProcessor_arithmetic.cpp b/tests/test_BinaryExpressionProcessor_arithmetic.cpp index 6ded2c991..10699f3c0 100644 --- a/tests/test_BinaryExpressionProcessor_arithmetic.cpp +++ b/tests/test_BinaryExpressionProcessor_arithmetic.cpp @@ -184,7 +184,7 @@ TEST_CASE("BinaryExpressionProcessor arithmetic", "[language]") { CHECK_BINARY_EXPRESSION_RESULT(R"(let z:Z, z = -1 + true;)", "z", 0l); CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let z:Z, z = -3 + n;)", "z", 1l); - CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let z:Z, z = -3 + n;)", "z", -1l); + CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let z:Z, z = (-3 + n);)", "z", -1l); CHECK_BINARY_EXPRESSION_RESULT(R"(let z:Z, z = 1 + 2;)", "z", 3l); CHECK_BINARY_EXPRESSION_RESULT(R"(let x:R, x = 3 + 2.5;)", "x", 5.5); } @@ -192,7 +192,7 @@ TEST_CASE("BinaryExpressionProcessor arithmetic", "[language]") SECTION("lhs is R") { CHECK_BINARY_EXPRESSION_RESULT(R"(let r:R, r = -1.2 + true;)", "r", (-1.2 + true)); - CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let r:R, r = -1.2 + n;)", "r", (-1.2 + uint64_t{2})); + CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let r:R, r = (-1.2 + n);)", "r", (-1.2 + uint64_t{2})); CHECK_BINARY_EXPRESSION_RESULT(R"(let r:R, r = -1.2 + 1;)", "r", (-1.2 + 1)); CHECK_BINARY_EXPRESSION_RESULT(R"(let r:R, r = -1.2 + 2.3;)", "r", (-1.2 + 2.3)); } @@ -219,7 +219,7 @@ TEST_CASE("BinaryExpressionProcessor arithmetic", "[language]") SECTION("lhs is Z") { CHECK_BINARY_EXPRESSION_RESULT(R"(let z:Z, z = -1 - true;)", "z", -2l); - CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let z:Z, z = 3 - n;)", "z", -1l); + CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let z:Z, z = (-3 - n + 6);)", "z", -1l); CHECK_BINARY_EXPRESSION_RESULT(R"(let z:Z, z = 7 - 2;)", "z", 5l); CHECK_BINARY_EXPRESSION_RESULT(R"(let x:R, x = 4 - 2.5;)", "x", 1.5); } -- GitLab