设为首页 加入收藏

TOP

[设计模式]解释器(Interpreter)之大胆向MM示爱吧(三)
2019-09-03 03:21:57 】 浏览:58
Tags:设计模式 解释 Interpreter 大胆 示爱
~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
首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇以SqlHelper为例论面向对象中封装.. 下一篇工厂方法模式与抽象工厂模式

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目