diff --git a/poincare/src/expression.cpp b/poincare/src/expression.cpp index 934d680a1..2211613b5 100644 --- a/poincare/src/expression.cpp +++ b/poincare/src/expression.cpp @@ -1,14 +1,22 @@ #include #include "expression_parser.hpp" #include "expression_lexer.hpp" -#include "simplify/simplify.h" -#include "simplify/simplify_product_zero.h" -#include "simplify/simplify_addition_integer.h" -#include "simplify/simplify_commutative_merge.h" extern "C" { #include } +#define USE_GENERIC_EXPRESSION_SIMPLIFIER 0 + +#if USE_GENERIC_EXPRESSION_SIMPLIFIER + +#include "simplify/simplification_rules.h" + +#else + +#include "simplify/simplify.h" +#include "simplify/simplify_product_zero.h" +#include "simplify/simplify_integer_operation.h" +#include "simplify/simplify_commutative_merge.h" static expression_simplifier_t kSimplifiers[] = { &SimplifyProductZero, @@ -17,6 +25,8 @@ static expression_simplifier_t kSimplifiers[] = { nullptr }; +#endif + int poincare_expression_yyparse(yyscan_t scanner, Expression ** expressionOutput); Expression::~Expression() { @@ -34,6 +44,27 @@ Expression * Expression::parse(char const * string) { return expression; } +#if USE_GENERIC_EXPRESSION_SIMPLIFIER +Expression * Expression::simplify() { + Expression * result = this; + bool simplification_pass_was_useful = true; + while (simplification_pass_was_useful) { + simplification_pass_was_useful = false; + for (int i=0; isimplify(result); + if (simplified != nullptr) { + simplification_pass_was_useful = true; + if (result != this) { + delete result; + } + result = simplified; + } + } + } + return result; +} +#else Expression * Expression::simplify() { Expression * result = this; bool simplification_pass_was_useful = true; @@ -54,6 +85,7 @@ Expression * Expression::simplify() { } return result; } +#endif bool Expression::isIdenticalTo(Expression * e) { if (e->type() != this->type() || e->numberOfOperands() != this->numberOfOperands()) {