summaryrefslogtreecommitdiff
path: root/simplifier.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'simplifier.cpp')
-rw-r--r--simplifier.cpp95
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;
+}