给定一个语言,定义它的文法的一种表示,并定义一个解释器。比如加减乘除在代码里是一种表示,我们需要翻译成可以阅读的数学公式,并且可以供用户输入数字得到输出结果。
我们将用示例代码来解释各个组成部分的意义。
- #include
- #include
-
- using namespace std;
-
- #define DELETE(pointer) delete pointer; pointer=nullptr
- const string key1 = string("s1");
- const string key2 = string("s2");
- const string key3 = string("s3");
- const string key4 = string("s4");
-
- class Context
- {
- public:
- Context() {
- datas[key1] = 1;
- datas[key2] = 2;
- datas[key3] = 3;
- datas[key4] = 4;
- }
-
- int getValue(string key) {
- if (!datas.count(key))
- {
- return 0;
- }
- return datas[key];
- }
-
- private:
- std::map
int> datas; - };
-
- class Expression
- {
- public:
- Expression(Expression* left, Expression* right) :left(left), right(right) { }
-
- virtual ~Expression() {
- if (left != nullptr)
- {
- DELETE(left);
- }
- if (right != nullptr)
- {
- DELETE(right);
- }
- }
-
- virtual int interpreter(Context* context) = 0;
-
- protected:
- Expression* left;
- Expression* right;
- };
-
- class MultiExpression : public Expression
- {
- public:
- MultiExpression(Expression* left, Expression* right) : Expression(left, right) { }
-
- int interpreter(Context* context) override {
- if ((left == nullptr) || (right == nullptr))
- {
- return 0;
- }
- return left->interpreter(context) * right->interpreter(context);
- }
- };
-
-
- class DivisionExpression : public Expression
- {
- public:
- DivisionExpression(Expression* left, Expression* right) : Expression(left, right) { }
-
- int interpreter(Context* context) override {
- if ((left == nullptr) || (right == nullptr))
- {
- return 0;
- }
- return left->interpreter(context) / right->interpreter(context);
- }
- };
-
- class TerminalExpression : public Expression
- {
- public:
- TerminalExpression(int value) : value(value), Expression(nullptr, nullptr) { }
- int interpreter(Context* context) {
- return value;
- }
-
- private:
- int value;
- };
-
- void doInterpreter() // 客户端client
- {
- /* 3*4/2==6 对应语法树如下:
- / (除法)
- / \
- * 2
- / \
- 3 4
- */
- Context context;
-
- MultiExpression* multiExpression = new MultiExpression(new TerminalExpression(context.getValue(key3))
- , new TerminalExpression(context.getValue(key4))); // 终止节点作为叶子结点,非终止节点作为非叶子节点
- int mutil = multiExpression->interpreter(&context);
- cout << "mutil==" << mutil << endl;
-
- DivisionExpression* divisionExpression = new DivisionExpression(multiExpression
- , new TerminalExpression(context.getValue(key2))); // 乘法表达式作为左子树 / 右子树
- int division = divisionExpression->interpreter(&context); // 运行解释器
- cout << "division==" << division << endl;
-
- DELETE(divisionExpression);
- // 这里注意,不能第二次释放divisionExpression,因为此时它是divisionExpression的左子树
- //,divisionExpression释放的时候会自动释放左右子树,也就是递归释放,最终只需要释放最后一次嵌套调用的就行
- }
-
- int main()
- {
- doInterpreter();
-
- system("pause");
- return 1;
- }
C++设计模式——解释器模式(interpreter pattern)_c++interpreter模式-CSDN博客