~Translator() {
12 if (_mCharSet) delete[] _mCharSet;
13 }
14
15 Expression* Translator::translate(string& str) {
16 Expression* result = 0;
17 for(unsigned int i = 0; i < str.size(); i++ ) {
18 if (str.at(i) == '[') {
19 int sEnd = str.find_last_of("]");
20 int sLen = sEnd - i - 1;
21 if (_mCharSet) delete[] _mCharSet;
22 _mCharSet = new char[sLen];
23 strcpy(_mCharSet, str.substr(i+1, sLen).data());
24 i = sEnd;
25 } else if (str.at(i) == '@') {
26 int sChar = atoi(str.substr(i + 1, 1).c_str());
27 Expression* tmp = new Constant(&_mCharSet[sChar], 1);
28 result = tmp;
29 i = i + 1;
30 } else if (str.at(i) == '(') {
31 int pos = i + 1;
32 int left = 0;
33 for (;pos < str.size(); pos++) {
34 if (str.at(pos) == ')') {
35 if (left == 0)
36 break;
37 else
38 left--;
39 }
40 if (str.at(pos) == '(')
41 left++;
42 }
43 string t_str = str.substr(i + 1, pos - i - 1);
44 Expression* tmp = translate(t_str);
45 _mExpGroup.push_back(tmp);
46 result = tmp;
47 i = pos;
48 } else if (str.at(i) == '+') {
49 string t_str = str.substr(i + 1);
50 result = new AddExpression(result, translate(t_str));
51 break;
52 } else if (str.at(i) == '*') {
53 int pos = i+1;
54 for (;pos < str.size();pos++) {
55 if (str.at(pos) > '9' || str.at(pos) < '0') break;
56 }
57 pos--;
58 int sRep = atoi(str.substr(i + 1, pos - i).c_str());
59 Expression* tmp = new RepeatExpression(result, sRep);
60 result = tmp;
61 i = pos;
62 } else if (str.at(i) == '^') {
63 Expression* tmp = new ReverseExpression(result);
64 result = tmp;
65 } else if (str.at(i) == '$') {
66 int pos = i+1;
67 for (;pos < str.size();pos++) {
68 if (str.at(pos) > '9' || str.at(pos) < '0') break;
69 }
70 pos--;
71 int nGroup = atoi(str.substr(i + 1, pos - i).c_str());
72 if (nGroup >= _mExpGroup.size()) return 0;
73 result = _mExpGroup[nGroup];
74 i = pos;
75 } else if (str.at(i) == '/') {
76 string t_str = str.substr(i + 1);
77 Expression* tmp = new Constant("\n");
78 if (!result) {
79 result = new AddExpression(tmp, translate(t_str));
80 }
81 else {
82 result = new AddExpression(new AddExpression(result, tmp), translate(t_str));
83 }
84 break;
85 } else if (str.at(i) == '_') {
86 int pos = i+1;
87 for (;pos < str.size();pos++) {
88 if (str.at(pos) > '9' || str.at(pos) < '0') break;
89 }
90 pos--;
91 int sRep = (pos == i) ? 1 : atoi(str.substr(i + 1, pos - i).c_str());
92 string t_str = str.substr(pos + 1);
93 Expression* tmp = new RepeatExpression(new Constant(" "), sRep);
94 if (!result) {
95 result = new AddExpression(tmp, translate(t_str));
96 }
97 else {
98 result = new AddExpression(new AddExpression(result, tmp), translate(t_str));
99 }
100 break;
101 }
102 }
103 return result;
104 }
Translator.cpp
再次强调,这个语法分析器,并不是解释器模式所讲的内容。好了,写个简单的main函数就可以运行了:
1 #include <iostream>
2 #include "expression.h"
3 #include "Translator.h"
4
5 using namespace std;
6
7 int main()
8 {
9 cout << "Input your command below: " << endl;
10 string str;
11 getline(cin, str);
12 Translator translator;
13
14 // ... Generate the Abstract Grammar Tree by Translator
15 Expression* myExp = translator.translate(str);
16 if (!myExp) return 1;
17
18 // ... Call Its Interpret Operation
19 stringstream ss;
20 myExp->eva l(ss);
21
22 cout << ss.str() <&l |