/* 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 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 (expr->getLeft()); Literal *right = dynamic_cast (expr->getRight()); if(left != NULL && right != NULL) return new Literal(expr->eval()); return NULL; } Expression *Simplifier::ruleMultiplyByOne(MultiplicationExpression *expr) { Literal *left = dynamic_cast (expr->getLeft()); Literal *right = dynamic_cast (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 (expr->getRight()); if (right != NULL && right->getValue() == 1) return expr->getLeft()->copy(); return NULL; } Expression *Simplifier::ruleMultiplyByZero(MultiplicationExpression *expr) { Literal *left = dynamic_cast (expr->getLeft()); Literal *right = dynamic_cast (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 (expr->getLeft()); if(left != NULL && left->getValue() == 0) return new Literal(0); return NULL; } Expression *Simplifier::ruleOnePower(PowerExpression *expr) { Literal *right = dynamic_cast (expr->getRight()); if(right != NULL && right->getValue() == 1) return expr->getLeft()->copy(); return NULL; } Expression *Simplifier::ruleZeroPower(PowerExpression *expr) { Literal *right = dynamic_cast (expr->getRight()); if(right != NULL && right->getValue() == 0) return new Literal(1); return NULL; } Expression *Simplifier::addZero(AddExpression *expr) { Literal *left = dynamic_cast (expr->getLeft()); Literal *right = dynamic_cast (expr->getRight()); if(left != NULL && left->getValue() == 0) return expr->getRight()->copy(); if(right != NULL && right->getValue() == 0) return expr->getLeft()->copy(); return NULL; }