summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/differentiator.hpp20
-rw-r--r--include/expressions.hpp13
-rw-r--r--include/parser.hpp8
3 files changed, 26 insertions, 15 deletions
diff --git a/include/differentiator.hpp b/include/differentiator.hpp
index f14f2d5..cef5211 100644
--- a/include/differentiator.hpp
+++ b/include/differentiator.hpp
@@ -14,15 +14,17 @@ private:
Expression *ptr;
public:
Differentiator();
- Expression *visit(Literal *expr);
- Expression *visit(Variable *expr);
- Expression *visit(Function *expr);
- Expression *visit(NegationExpression *expr);
- Expression *visit(AddExpression *expr);
- Expression *visit(SubExpression *expr);
- Expression *visit(DivisionExpression *expr);
- Expression *visit(MultiplicationExpression *expr);
- Expression *visit(PowerExpression *expr);
+ Expression *visit(Literal *expr) const;
+ Expression *visit(Variable *expr) const;
+ Expression *visit(Function *expr) const;
+ Expression *visit(NegationExpression *expr) const;
+ Expression *visit(AddExpression *expr) const;
+ Expression *visit(SubExpression *expr) const;
+ Expression *visit(DivisionExpression *expr) const;
+ Expression *visit(MultiplicationExpression *expr) const;
+ Expression *visit(PowerExpression *expr) const;
};
+Expression *deriv(Expression *to_deriv);
+
#endif /* DIFFERENTIATOR_H */
diff --git a/include/expressions.hpp b/include/expressions.hpp
index 3191436..a293408 100644
--- a/include/expressions.hpp
+++ b/include/expressions.hpp
@@ -23,14 +23,14 @@ enum trig_functions {
i_ctg
};
-class Differentiator; // Forward declaration.
+class Differentiator; // Forward declaration
class Expression {
public:
Expression(Expression *left, Expression *right, token_type type);
virtual ~Expression() = default;
std::string getRepr();
- Expression *diff(const Differentiator *d);
+ virtual Expression *diff(const Differentiator *d) = 0;
Expression *getLeft();
Expression *getRight();
virtual float eval(int arg) = 0;
@@ -52,6 +52,7 @@ public:
~Literal();
int getValue();
float eval(int arg) override;
+ Expression *diff(const Differentiator *d) override;
Expression *copy() override;
protected:
void setRepr() override;
@@ -66,6 +67,7 @@ public:
~Function();
Expression *getArg();
float eval(int arg) override;
+ Expression *diff(const Differentiator *d) override;
trig_functions getFunctionName() const;
Expression *copy() override;
protected:
@@ -80,6 +82,7 @@ public:
explicit Variable(char name);
~Variable();
float eval(int arg) override;
+ Expression *diff(const Differentiator *d) override;
Expression *copy() override;
protected:
void setRepr() override;
@@ -90,6 +93,7 @@ public:
AddExpression(Expression *left, Expression *right);
~AddExpression();
float eval(int arg) override;
+ Expression *diff(const Differentiator *d) override;
Expression *copy() override;
};
@@ -99,6 +103,7 @@ public:
~SubExpression();
float eval(int arg) override;
Expression *copy() override;
+ Expression *diff(const Differentiator *d) override;
};
class NegationExpression : public Expression {
@@ -107,6 +112,7 @@ public:
~NegationExpression();
float eval(int arg) override;
Expression *copy() override;
+ Expression *diff(const Differentiator *d) override;
protected:
void setRepr() override;
};
@@ -117,6 +123,7 @@ public:
~DivisionExpression();
float eval(int arg) override;
Expression *copy() override;
+ Expression *diff(const Differentiator *d) override;
};
class MultiplicationExpression : public Expression {
@@ -125,6 +132,7 @@ public:
~MultiplicationExpression();
float eval(int arg) override;
Expression *copy() override;
+ Expression *diff(const Differentiator *d) override;
};
class PowerExpression : public Expression {
@@ -133,6 +141,7 @@ public:
~PowerExpression();
float eval(int arg) override;
Expression *copy() override;
+ Expression *diff(const Differentiator *d) override;
};
#endif /* EXPRESSIONS_H */
diff --git a/include/parser.hpp b/include/parser.hpp
index 567ef03..a4e11af 100644
--- a/include/parser.hpp
+++ b/include/parser.hpp
@@ -5,7 +5,7 @@
#ifndef PARSER_H
#define PARSER_H
#include <string>
-#include <vector>
+#include <deque>
#include "expressions.hpp"
#include "lexer.hpp"
@@ -13,11 +13,11 @@ class Parser{
private:
std::string text;
Lexer tokenizer;
- std::vector<Expression *> tree_stack;
+ std::deque<Expression *> tree_queue;
Token var{nil, "{}"};
void panic();
- Expression *popStack();
- Expression *newTree(token_type type);
+ Expression *popQueue();
+ Expression *newTree(token_type type, Expression *left, Expression *right);
void setText(std::string text);
void parseExpr();
void parsePrimeExpr();