解释器模式

【1】什么是解释器模式?

解释器模式:拟定一种 “语言”,定义该语言文法的一种表示,并定义一种解释器,这个解释器使用该表示文法来解释语言中的句子。

【2】解释器模式代码示例:

(1)代码示例1:

 1 #include <iostream>
 2 #include <list>
 3 #include <string>
 4 using namespace std;
 5 
 6 class Context;
 7 
 8 class AbstractExpression
 9 {
10 public:
11     virtual void interpret(Context *) = 0;
12 };
13 
14 class TerminalExpression : public AbstractExpression
15 {
16 public:
17     void interpret(Context *context)
18     {
19         cout << "终端解释器" << endl;
20     }
21 };
22 
23 class NonterminalExpression : public AbstractExpression
24 {
25 public:
26     void interpret(Context *context)
27     {
28         cout << "非终端解释器" << endl;
29     }
30 };
31 
32 class Context
33 {
34 public:
35     string input, output;
36 };
37 
38 int main()
39 {
40     Context *context = new Context(); 
41     list<AbstractExpression*>  lt;
42     lt.push_back(new TerminalExpression());
43     lt.push_back(new NonterminalExpression());
44     lt.push_back(new TerminalExpression());
45     lt.push_back(new TerminalExpression());
46     
47     for (list<AbstractExpression*>::iterator iter = lt.begin(); iter != lt.end(); iter++)
48     {
49         (*iter)->interpret(context);
50     }
51     
52     return 0;
53 }
54 // Result:
55 /*
56 终端解释器
57 非终端解释器
58 终端解释器
59 终端解释器
60 */
View Code

(2)代码示例2:

  1 #include <iostream>  
  2 #include <map>  
  3 #include <string>  
  4  
  5 using namespace std;  
  6 
  7 class Context
  8 {
  9 private:
 10     map<string, int> valueMap;
 11 
 12 public:
 13     void addValue(string key,int value)
 14     {       
 15         valueMap.insert(std::pair<string, int>(key, value));   // 插入构建项
 16     }
 17 
 18     int getValue(string key)
 19     {
 20         return valueMap[key]; // 解析值
 21     }
 22 };
 23 
 24 class AbstractExpression
 25 {
 26 public :
 27      virtual int interpreter(Context context) = 0;
 28 };
 29 
 30 class AddNonterminalExpression : public AbstractExpression
 31 {
 32 private :
 33     AbstractExpression *left;
 34     AbstractExpression *right;
 35 
 36 public:
 37     AddNonterminalExpression(AbstractExpression *left, AbstractExpression *right)
 38         : left(left)
 39         , right(right)
 40     {
 41     }
 42 
 43     int interpreter(Context context)
 44     {
 45         return (left->interpreter(context)) + (right->interpreter(context));
 46     }
 47 };
 48 
 49 class SubtractNonterminalExpression : public AbstractExpression
 50 {
 51 private :
 52     AbstractExpression *left;
 53     AbstractExpression *right;
 54 
 55 public:
 56     SubtractNonterminalExpression(AbstractExpression *left, AbstractExpression *right)
 57         : left(left)
 58         , right(right)
 59     {
 60     }
 61 
 62     int interpreter(Context context)
 63     {
 64         return (left->interpreter(context)) - (right->interpreter(context));
 65     }
 66 };
 67 
 68 class TerminalExpression : public AbstractExpression
 69 {
 70 private :
 71     int i;
 72 public :
 73     TerminalExpression(int i) : i(i)
 74     {
 75     }
 76 
 77     int interpreter(Context context)
 78     {
 79         return i;
 80     }
 81 };
 82 
 83 int main()
 84 {  
 85     // a - b + c
 86     Context context;
 87     context.addValue("a", 10);
 88     context.addValue("b", 8);
 89     context.addValue("c", 2);
 90 
 91     SubtractNonterminalExpression *subtractValue = 
 92         new SubtractNonterminalExpression(new TerminalExpression(context.getValue("a")), new TerminalExpression(context.getValue("b")));
 93 
 94     AddNonterminalExpression *addValue = new AddNonterminalExpression(subtractValue, new TerminalExpression(context.getValue("c")));
 95 
 96     cout << subtractValue->interpreter(context);  // 10 - 8 = 2
 97     cout << addValue->interpreter(context);  // 2 + 2 = 4
 98     
 99     return 0;  
100 }  
View Code

 【3】应用

通常当一个语言需要解释执行,并且你可以将语言中的句子表示成为一个抽象的语法树时,可以使用解释器模式。

 

Good   Good   Study,  Day   Day  Up.

顺序   选择  循环  总结

posted @ 2014-09-04 22:23  kaizenly  阅读(269)  评论(0编辑  收藏  举报
打赏