设计模式之9.3 领域模式 interpreter 解析器


image1.png

Interpreter 解析器

image2.png

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
//解析器模式
#include <iostream>
#include <map>
#include <stack>

using namespace std;

class Expression {
public:
virtual int interpreter(map<char, int> var)=0;
virtual ~Expression(){}
};

//变量表达式
class VarExpression: public Expression {

char key;

public:
VarExpression(const char& key)
{
this->key = key;
}

int interpreter(map<char, int> var) override {
return var[key];
}

};

//符号表达式
class SymbolExpression : public Expression {

// 运算符左右两个参数
protected:
Expression* left;
Expression* right;

public:
SymbolExpression( Expression* left, Expression* right):
left(left),right(right){

}

};

//加法运算
class AddExpression : public SymbolExpression {

public:
AddExpression(Expression* left, Expression* right):
SymbolExpression(left,right){

}
int interpreter(map<char, int> var) override {
return left->interpreter(var) + right->interpreter(var);
}

};

//减法运算
class SubExpression : public SymbolExpression {

public:
SubExpression(Expression* left, Expression* right):
SymbolExpression(left,right){

}
int interpreter(map<char, int> var) override {
return left->interpreter(var) - right->interpreter(var);
}

};



Expression* analyse(string expStr) {

stack<Expression*> expStack;
Expression* left = nullptr;
Expression* right = nullptr;
for(int i=0; i<expStr.size(); i++)
{
switch(expStr[i])
{
case '+':
// 加法运算
left = expStack.top();
right = new VarExpression(expStr[++i]);
expStack.push(new AddExpression(left, right));
break;
case '-':
// 减法运算
left = expStack.top();
right = new VarExpression(expStr[++i]);
expStack.push(new SubExpression(left, right));
break;
default:
// 变量表达式
expStack.push(new VarExpression(expStr[i]));
}
}

Expression* expression = expStack.top();

return expression;
}

void release(Expression* expression){

//释放表达式树的节点内存...
}

int main(int argc, const char * argv[]) {


string expStr = "a+b-c+d-e";
map<char, int> var;
var.insert(make_pair('a',5)); //a=5
var.insert(make_pair('b',2)); //b=2
var.insert(make_pair('c',1)); //c=1
var.insert(make_pair('d',6)); //d=6
var.insert(make_pair('e',10)); //e=10


Expression* expression= analyse(expStr);

int result=expression->interpreter(var);

cout<<result<<endl;

release(expression);

return 0;
}

image3.png
image4.png
image5.png
image6.png
image7.png