#include <iostream>
#include <memory>
class Context {
public:
std::string getData() { return data_; }
void setData(std::string data) { this->data_ = data; }
private:
std::string data_;
};
class AbstractExpression {
public:
virtual void interprete(std::shared_ptr<Context> c) = 0;
};
class TerminalExpression : public AbstractExpression {
public:
void interprete(std::shared_ptr<Context> c) override {
std::string data = c->getData();
std::cout << "In TerminalExpression interpreter(). The data is " << data << std::endl;
}
};
class NonterminalExpression : public AbstractExpression {
public:
void interprete(std::shared_ptr<Context> c) override {
std::string data = c->getData();
std::cout << "In NonterminalExpression interpreter(). The data is " << data << std::endl;
}
};
int main(int argc, char *argv[]){
std::string s = "ABC";
std::shared_ptr<Context> c = std::make_shared<Context>();
c->setData(s);
std::shared_ptr<AbstractExpression> te = std::make_shared<TerminalExpression>();
std::shared_ptr<AbstractExpression> ne = std::make_shared<NonterminalExpression>();
te->interprete(c);
ne->interprete(c);
return 1;
}