-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.cpp
141 lines (115 loc) · 3.34 KB
/
main.cpp
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
136
137
138
139
140
141
#include <iostream>
#include <map>
#include <stack>
using namespace std;
/**
* Interpreter
* 给定一个语言,定义它的文法的一种表示,并定义一种解释器,这个解释器使用该表达来解释语言中的句子。
*/
// 表达式
class Expression {
public:
virtual int interpreter(map<char, int> &var) = 0;
virtual ~Expression() = default;
};
// 值表达式
class VarExpression : public Expression {
public:
explicit VarExpression(char key) {
this->key = key;
}
int interpreter(map<char, int> &var) override {
return var[key];
}
private:
char key;
};
// 运算符表达式
class SymbolExpression : public Expression {
protected:
// 将构造函数声明为受保护的,不希望客户实例化该对象
SymbolExpression(Expression *left, Expression *right) {
this->left = left;
this->right = right;
}
// 表达式的左值
Expression *left;
// 表达式的右值
Expression *right;
~SymbolExpression() override {
delete left;
delete 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);
}
};
class Analyse {
public:
Expression *operator()(const string &expStr) {
Expression *left = nullptr;
Expression *right = nullptr;
// 栈顶元素为解析的结果
stack<Expression *> c;
for (size_t i = 0; i < expStr.size(); ++i) {
switch (expStr[i]) {
case '+':
// 如果当前是加号
// 栈顶元素作为左值,加号之后的下一个元素作为右值,重新压入栈中
left = c.top();
right = new VarExpression(expStr[++i]);
c.push(new AddExpression(left, right));
break;
case '-':
// 如果当前是减号
// 栈顶元素作为左值,减号之后的下一个元素作为右值,重新压入栈中
left = c.top();
right = new VarExpression(expStr[++i]);
c.push(new SubExpression(left, right));
break;
default:
// 如果不是加号或减号,代表当前为一个值表达式
c.push(new VarExpression(expStr[i]));
break;
}
}
// 返回栈顶元素
return c.top();
}
};
int main() {
// 将要进行解析的表达式
string expStr = "a+b-c+d";
// 表达式中各元素所代表的数值
map<char, int> var;
var.insert(make_pair('a', 1));
var.insert(make_pair('b', 2));
var.insert(make_pair('c', 3));
var.insert(make_pair('d', 4));
// 进行表达式的解析
Expression *expression = Analyse()(expStr);
// 输出结果
cout << expression->interpreter(var) << endl;
// 释放资源
delete expression;
return 0;
}