summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHombreLaser <sebastian-440@live.com>2022-04-20 22:29:22 -0500
committerHombreLaser <sebastian-440@live.com>2022-04-20 22:29:22 -0500
commit65f4fa37ee19e0a0d7edd6533e11346a0b8f67af (patch)
tree18878adaface22bc342e905438871b63dc1f9ffe
parent3f9e0da725963bb27aeccf852bf342a9cce2a34b (diff)
Corregidos errores y preparado simplificador
-rw-r--r--include/differentiator.hpp1
-rw-r--r--include/simplifier.hpp26
-rw-r--r--lexer.cpp6
-rw-r--r--parser.cpp2
4 files changed, 33 insertions, 2 deletions
diff --git a/include/differentiator.hpp b/include/differentiator.hpp
index cef5211..7291664 100644
--- a/include/differentiator.hpp
+++ b/include/differentiator.hpp
@@ -4,7 +4,6 @@
#ifndef DIFFERENTIATOR_H
#define DIFFERENTIATOR_H
-#include <string>
#include "expressions.hpp"
diff --git a/include/simplifier.hpp b/include/simplifier.hpp
new file mode 100644
index 0000000..8bc363d
--- /dev/null
+++ b/include/simplifier.hpp
@@ -0,0 +1,26 @@
+#ifndef SIMPLIFIER_H
+#define SIMPLIFIER_H
+#include "expressions.hpp"
+
+class Simplifier {
+private:
+ void simplifyChildren(Expression *root, Expression *left, Expression *right);
+ Expression *ruleMultiplyByOne(MultiplicationExpression *expr);
+ Expression *ruleDivideByOne(DivisionExpression *expr);
+ Expression *ruleMultiplyByZero(MultiplicationExpression *expr);
+ Expression *ruleZeroDivision(DivisionExpression *expr);
+ Expression *ruleOnePower(PowerExpression *expr);
+ Expression *ruleZeroPower(PowerExpression *expr);
+public:
+ Expression *visit(Variable *expr);
+ Expression *visit(Literal *expr);
+ Expression *visit(Function *expr);
+ Expression *visit(NegationExpression *expr);
+ Expression *visit(AddExpression *expr);
+ Expression *visit(SubExpression *expr);
+ Expression *visit(MultiplicationExpression *expr);
+ Expression *visit(DivisionExpression *expr);
+ Expression *visit(PowerExpression *expr);
+};
+
+#endif /* SIMPLIFIER_H */
diff --git a/lexer.cpp b/lexer.cpp
index 26432ae..98fb0a6 100644
--- a/lexer.cpp
+++ b/lexer.cpp
@@ -38,6 +38,12 @@ bool Lexer::matchFunction(const string &function_name){
string Lexer::createNumber(){
string number;
+ if(text[current_char] == '0') {
+ ++current_char;
+
+ return "0";
+ }
+
while(isdigit(text[current_char]) && current_char < text.length())
{
number += text[current_char];
diff --git a/parser.cpp b/parser.cpp
index 04f6a50..98f6e2c 100644
--- a/parser.cpp
+++ b/parser.cpp
@@ -119,7 +119,7 @@ void Parser::parsePrimePower() {
if(tokenizer.getCurrentToken().type == power) {
tokenizer.nextToken();
- if(tokenizer.getCurrentToken().type != number)
+ if(tokenizer.getCurrentToken().type != number || tokenizer.getCurrentToken().value == "0")
panic();
left = popQueue();