diff options
Diffstat (limited to 'simplifier.cpp')
-rw-r--r-- | simplifier.cpp | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/simplifier.cpp b/simplifier.cpp new file mode 100644 index 0000000..8fb926c --- /dev/null +++ b/simplifier.cpp @@ -0,0 +1,95 @@ +/* PIA - Lenguajes Modernos de Programación + * FACULTAD DE CIENCIAS FÍSICO MATEMÁTICAS + * Luis Sebastián Martínez Vega - LCC */ + +#include "include/simplifier.hpp" +#include "include/expressions.hpp" +#include <cstddef> + +void Simplifier::simplifyChildren(Expression *root, Expression *left, Expression *right) { + left = root->getLeft()->simplify(root->getLeft(), this); + right = root->getRight()->simplify(root->getRight(), this); +} + +// Reglas de simplificación. +Expression *Simplifier::ruleEval(Expression *expr) { + Literal *left = dynamic_cast <Literal *>(expr->getLeft()); + Literal *right = dynamic_cast <Literal *>(expr->getRight()); + + if(left != NULL && right != NULL) + return new Literal(expr->eval()); + + return NULL; +} + +Expression *Simplifier::ruleMultiplyByOne(MultiplicationExpression *expr) { + Literal *left = dynamic_cast <Literal *>(expr->getLeft()); + Literal *right = dynamic_cast <Literal *>(expr->getRight()); + + if(left != NULL && left->getValue() == 1) + return expr->getRight()->copy(); + + if(right != NULL && right->getValue() == 1) + return expr->getLeft()->copy(); + + return NULL; +} + +Expression *Simplifier::ruleDivideByOne(DivisionExpression *expr) { + Literal *right = dynamic_cast <Literal *>(expr->getRight()); + + if (right != NULL && right->getValue() == 1) + return expr->getLeft()->copy(); + + return NULL; +} + +Expression *Simplifier::ruleMultiplyByZero(MultiplicationExpression *expr) { + Literal *left = dynamic_cast <Literal *>(expr->getLeft()); + Literal *right = dynamic_cast <Literal *>(expr->getRight()); + + if((left != NULL && left->getValue() == 0) || (right != NULL && right->getValue() == 0)) + return new Literal(0); + + return NULL; +} + +Expression *Simplifier::ruleZeroDivision(DivisionExpression *expr) { + Literal *left = dynamic_cast <Literal *>(expr->getLeft()); + + if(left != NULL && left->getValue() == 0) + return new Literal(0); + + return NULL; +} + +Expression *Simplifier::ruleOnePower(PowerExpression *expr) { + Literal *right = dynamic_cast <Literal *>(expr->getRight()); + + if(right != NULL && right->getValue() == 1) + return expr->getLeft()->copy(); + + return NULL; +} + +Expression *Simplifier::ruleZeroPower(PowerExpression *expr) { + Literal *right = dynamic_cast <Literal *>(expr->getRight()); + + if(right != NULL && right->getValue() == 0) + return new Literal(1); + + return NULL; +} + +Expression *Simplifier::addZero(AddExpression *expr) { + Literal *left = dynamic_cast <Literal *>(expr->getLeft()); + Literal *right = dynamic_cast <Literal *>(expr->getRight()); + + if(left != NULL && left->getValue() == 0) + return expr->getRight()->copy(); + + if(right != NULL && right->getValue() == 0) + return expr->getLeft()->copy(); + + return NULL; +} |