解释器(Interpreter)之大胆向MM示爱吧(二)

2014-11-23 23:35:02 · 作者: · 浏览: 1
8 };
39
40 // ... ReverseExpression Class ...
41 class ReverseExpression : public Expression {
42 public:
43 ReverseExpression(Expression*);
44
45 void eva l(stringstream&);
46 private:
47 Expression* _oper;
48 };
49
50 // ... Constant Class ...
51 class Constant : public Expression {
52 public:
53 Constant(const char*);
54 Constant(const char*, int);
55
56 void eva l(stringstream&);
57 private:
58 string _mStr;
59 };
60
61 #endif // EXPRESSION_H_INCLUDED
clude "expression.h"
2 #include
3 using namespace std;
4
5 // ... RepeatExpression BEGIN ...
6 RepeatExpression::RepeatExpression(Expression* oper, int m) {
7 _oper = oper;
8 _mNum = m;
9 }
10
11 void RepeatExpression::eva l(stringstream& ss) {
12 stringstream t_str;
13 _oper->eva l(t_str);
14 for (int i = 0; i < _mNum; i++) {
15 ss << t_str.str();
16 }
17 }
18 // ... RepeatExpression END ...
19
20 // ... AddExpression BEGIN ...
21 AddExpression::AddExpression(Expression* oper1, Expression* oper2) {
22 _oper1 = oper1;
23 _oper2 = oper2;
24 }
25
26 void AddExpression::eva l(stringstream& ss) {
27 stringstream t_str;
28 _oper1->eva l(t_str);
29 _oper2->eva l(t_str);
30 ss << t_str.str();
31 }
32 // ... AddExpression END ...
33
34 // ... ReverseExpression BEGIN ...
35 ReverseExpression::ReverseExpression(Expression* o) {
36 _oper = o;
37 }
38
39 void ReverseExpression::eva l(stringstream& ss) {
40 stringstream t_str;
41 _oper->eva l(t_str);
42 string str = t_str.str();
43 reverse(str.begin(), str.end());
44 ss << str;
45 }
46 // ... ReverseExpression END ...
47
48 // ... Constant BEGIN ...
49 Constant::Constant(const char* str) {
50 _mStr = string(str);
51 }
52
53 Constant::Constant(const char* str, int len) {
54 _mStr = string(str, len);
55 }
56
57 void Constant::eva l(stringstream& ss) {
58 ss << _mStr;
59 }
60 // ... Constant END ...
复制代码
到了这里,我们如果想生成一个字符画: "~~o>_
复制代码
1 stringstream ss;
2
3 Expression* e1 = new RepeatExpression(new Constant("~"), 2);
4 Expression* e2 = new AddExpression(e1, new Constant("o>"));
5 Expression* e3 = new AddExpression(e2, new Constant("_"));
6 Expression* result = new AddExpression(e3, new ReverseExpression(e2));
7
8 result->eva l(ss);
9 cout << ss.str() << endl;
复制代码
其实解释器模式部分的 编程已经结束了。但显然这个并没有达到前言中翻译那串莫名字符串的目的。为此,我们还需在此基础上,定义一些语法,写一个语法分析器来将那串字符构建成抽象语法树。这里,我就偷懒了,写了个非常简单,没有什么优化的语法分析器:
复制代码
// 定义的一些符号含义:
// [] ---- 字符集
// () ---- 分组
// @N ---- 取字符集中第N个字符(N从0开始)
// *N ---- *前面的表达式重复N次
// $N ---- 取第N个分组(N从0开始,分组由括号顺序确定,嵌套的括号以从里到外的规则递增)
// + ---- 加号两边的表达式拼接
// ^ ---- ^前面的表达式逆序
// _N ---- 拼接N个空格
// / ---- 拼接一个换行符ndef TRANSLATOR_H_INCLUDED
2 #define TRANSLATOR_H_INCLUDED
3
4 #include
5 #include
6 using namespace std;
7
8 class Expression;
9
10 class Translator {
11 public:
12 Translator();
13 ~Translator();
14 Expression* translate(string& str);
15
16 private:
17 Expression* translateExp(string& str);
18 char* _mCharSet;
19 vector _mExpGroup;
20 };
21
22 #endif // TRANSLATOR_H_INCLUDED
1 #include "Translator.h"
2 #include "expression.h"
3 #include
4 #include
5 using namespace std;
6
7 Translator::Translator() {
8 _mCharSet = 0;
9 }
10
11 Translator::~Tran