Skip to content

Commit 473da2d

Browse files
authored
Add files via upload
1 parent 840c5eb commit 473da2d

File tree

1 file changed

+136
-0
lines changed

1 file changed

+136
-0
lines changed

Interpreter/main.cpp

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
2+
#include <iostream>
3+
#include <map>
4+
#include <stack>
5+
6+
using namespace std;
7+
8+
class Expression {
9+
public:
10+
virtual int interpreter(map<char, int> var)=0;
11+
virtual ~Expression(){}
12+
};
13+
14+
//变量表达式
15+
class VarExpression: public Expression {
16+
17+
char key;
18+
19+
public:
20+
VarExpression(const char& key)
21+
{
22+
this->key = key;
23+
}
24+
25+
int interpreter(map<char, int> var) override {
26+
return var[key];
27+
}
28+
29+
};
30+
31+
//符号表达式
32+
class SymbolExpression : public Expression {
33+
34+
// 运算符左右两个参数
35+
protected:
36+
Expression* left;
37+
Expression* right;
38+
39+
public:
40+
SymbolExpression( Expression* left, Expression* right):
41+
left(left),right(right){
42+
43+
}
44+
45+
};
46+
47+
//加法运算
48+
class AddExpression : public SymbolExpression {
49+
50+
public:
51+
AddExpression(Expression* left, Expression* right):
52+
SymbolExpression(left,right){
53+
54+
}
55+
int interpreter(map<char, int> var) override {
56+
return left->interpreter(var) + right->interpreter(var);
57+
}
58+
59+
};
60+
61+
//减法运算
62+
class SubExpression : public SymbolExpression {
63+
64+
public:
65+
SubExpression(Expression* left, Expression* right):
66+
SymbolExpression(left,right){
67+
68+
}
69+
int interpreter(map<char, int> var) override {
70+
return left->interpreter(var) - right->interpreter(var);
71+
}
72+
73+
};
74+
75+
76+
77+
Expression* analyse(string expStr) {
78+
79+
stack<Expression*> expStack;
80+
Expression* left = nullptr;
81+
Expression* right = nullptr;
82+
for(int i=0; i<expStr.size(); i++)
83+
{
84+
switch(expStr[i])
85+
{
86+
case '+':
87+
// 加法运算
88+
left = expStack.top();
89+
right = new VarExpression(expStr[++i]);
90+
expStack.push(new AddExpression(left, right));
91+
break;
92+
case '-':
93+
// 减法运算
94+
left = expStack.top();
95+
right = new VarExpression(expStr[++i]);
96+
expStack.push(new SubExpression(left, right));
97+
break;
98+
default:
99+
// 变量表达式
100+
expStack.push(new VarExpression(expStr[i]));
101+
}
102+
}
103+
104+
Expression* expression = expStack.top();
105+
106+
return expression;
107+
}
108+
109+
void release(Expression* expression){
110+
111+
//释放表达式树的节点内存...
112+
}
113+
114+
int main(int argc, const char * argv[]) {
115+
116+
117+
string expStr = "a+b-c+d-e";
118+
map<char, int> var;
119+
var.insert(make_pair('a',5));
120+
var.insert(make_pair('b',2));
121+
var.insert(make_pair('c',1));
122+
var.insert(make_pair('d',6));
123+
var.insert(make_pair('e',10));
124+
125+
126+
Expression* expression= analyse(expStr);
127+
128+
int result=expression->interpreter(var);
129+
130+
cout<<result<<endl;
131+
132+
release(expression);
133+
134+
return 0;
135+
}
136+

0 commit comments

Comments
 (0)