设为首页 加入收藏

TOP

[设计模式]解释器(Interpreter)之大胆向MM示爱吧(二)
2019-09-03 03:21:57 】 浏览:59
Tags:设计模式 解释 Interpreter 大胆 示爱
... 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 expression.h
 1 #include "expression.h"
 2 #include <algorithm>
 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 ...
expression.cpp

到了这里,我们如果想生成一个字符画: "~~o>_<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个空格 // / ---- 拼接一个换行符

具体代码如下:

 1 #ifndef TRANSLATOR_H_INCLUDED
 2 #define TRANSLATOR_H_INCLUDED
 3 
 4 #include <string>
 5 #include <vector>
 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<Expression*> _mExpGroup;
20 };
21 
22 #endif // TRANSLATOR_H_INCLUDED
Translator.h
  1 #include "Translator.h"
  2 #include "expression.h"
  3 #include <cstring>
  4 #include <cstdlib>
  5 using namespace std;
  6 
  7 Translator::Translator() {
  8     _mCharSet = 0;
  9 }
 10 
 11 Translator::
首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇以SqlHelper为例论面向对象中封装.. 下一篇工厂方法模式与抽象工厂模式

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目