From 65f4fa37ee19e0a0d7edd6533e11346a0b8f67af Mon Sep 17 00:00:00 2001 From: HombreLaser Date: Wed, 20 Apr 2022 22:29:22 -0500 Subject: Corregidos errores y preparado simplificador --- include/differentiator.hpp | 1 - include/simplifier.hpp | 26 ++++++++++++++++++++++++++ lexer.cpp | 6 ++++++ parser.cpp | 2 +- 4 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 include/simplifier.hpp 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 #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(); -- cgit v1.2.3