设计模式笔记--行为型模式-之三 解释器

 

意图:

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

适用性:

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

效果:

1易于改变和扩展文法 该模式使用类来表示文法规则,可使用继承来改变或扩展文法

2易于实现文法 定义抽象语法树中各个节点的类大体类似,这些类易于直接编写

3 复杂的文法难以维护

4增加了新的解释表达式的方法

实现:

1创建抽象语法树 抽象语法树可用一个表驱动的语法分析程序来生成,也可由手写,或直接由Client提供

2定义解释操作 不一定在表达式中定义解释操作,若要经常创建一种新的解释器,那么使用Visitor模式将解释放入一个独立的访问者对象

3Flyweight模式共享终结符 在一些文法中,一个句子可能多次出现同一个终结符。此时最好共享那个符号的单个拷贝。

Interpreter.h
  1. class Context;
  2. class VariableExp;
  3. #define MAX_NUM 30
  4. class BooleanExp
  5. {
  6. public:
  7.     BooleanExp();
  8.     virtual  ~BooleanExp();
  9.     virtual bool Evaluate(Context&) = 0;
  10.     virtual BooleanExp* Replace(const char*,BooleanExp&) = 0;
  11.     virtual BooleanExp* Copy() const = 0;
  12. };
  13. class Context
  14. {
  15. public:
  16.     Context();
  17.     ~Context();
  18.     bool Lookup(const char*) const;
  19.     void Assign(VariableExp* x,bool y);
  20. private:
  21.     char* _name[MAX_NUM];
  22.     bool  _value[MAX_NUM];
  23. };
  24. class VariableExp : public BooleanExp
  25. {
  26. public:
  27.     VariableExp(const char*);
  28.     virtual ~VariableExp();
  29.     virtual bool Evaluate(Context&);
  30.     virtual BooleanExp* Replace(const char*,BooleanExp&);
  31.     virtual BooleanExp* Copy() const;
  32.     char* getname() const {return _name;}
  33. private:
  34.     char* _name;
  35. };
  36. class AndExp:public BooleanExp
  37. {
  38. public:
  39.     AndExp(BooleanExp*,BooleanExp*);
  40.     virtual ~AndExp();
  41.     virtual bool Evaluate(Context&);
  42.     virtual BooleanExp* Replace(const char*,BooleanExp&);
  43.     virtual BooleanExp* Copy() const;
  44. private:
  45.     BooleanExp* _operand1;
  46.     BooleanExp* _operand2;
  47. };
  48. class OrExp: public BooleanExp
  49. {
  50. public:
  51.     OrExp(BooleanExp*,BooleanExp*);
  52.     virtual  ~OrExp();
  53.     virtual bool Evaluate(Context&);
  54.     virtual BooleanExp* Replace(const char*,BooleanExp&);
  55.     virtual BooleanExp* Copy() const;
  56. private:
  57.     BooleanExp* _operand1;
  58.     BooleanExp* _operand2;
  59. };
Interpreter.cpp
  1. #include "Interpreter.h"
  2. #include <iostream>
  3. #include <string>
  4. using namespace std;
  5. VariableExp::VariableExp(const char* name):BooleanExp()
  6. {
  7.     cout<<"A variableexp is created"<<endl;
  8.     _name = strdup(name);
  9. }
  10. VariableExp::~VariableExp()
  11. {
  12.     cout<<"A variableexp id destroyed"<<endl;
  13. }
  14. bool VariableExp::Evaluate(Context& aContext)
  15. {
  16.     return aContext.Lookup(_name);
  17. }
  18. BooleanExp* VariableExp::Copy() const
  19. {
  20.     return new VariableExp(_name);
  21. }
  22. BooleanExp* VariableExp::Replace(const char* name,BooleanExp& exp)
  23. {
  24.     if (strcmp(name,_name) == 0)
  25.     {
  26.         return exp.Copy();
  27.     }
  28.     else
  29.     {
  30.         return new VariableExp(_name);
  31.     }
  32. }
  33. AndExp::AndExp(BooleanExp* op1,BooleanExp* op2)
  34. {
  35.     _operand1 = op1;
  36.     _operand2 = op2;
  37.     cout<<"An And Exp is created"<<endl;
  38. }
  39. AndExp::~AndExp()
  40. {
  41.     cout<<"An Or Exp is destroyed"<<endl;
  42. }
  43. bool AndExp::Evaluate(Context& aContext)
  44. {
  45.     return _operand1->Evaluate(aContext)&
  46.            _operand2->Evaluate(aContext);
  47. }
  48. BooleanExp* AndExp::Copy() const
  49. {
  50.     return new AndExp(_operand1->Copy(), _operand2->Copy());
  51. }
  52. BooleanExp* AndExp::Replace(const char* name,BooleanExp& exp)
  53. {
  54.     return new AndExp(_operand1->Replace(name,exp),
  55.                       _operand2->Replace(name,exp)
  56.                       );
  57. }
  58. OrExp::OrExp(BooleanExp* op1,BooleanExp* op2)
  59. {
  60.     _operand1 = op1;
  61.     _operand2 = op2;
  62.     cout<<"An Or operator is created"<<endl;
  63. }
  64. OrExp::~OrExp()
  65. {
  66.     cout<<"An Or operator is destroyed"<<endl;
  67. }
  68. bool OrExp::Evaluate(Context& aContext)
  69. {
  70.     return (_operand1->Evaluate(aContext))||
  71.           ( _operand2->Evaluate(aContext));
  72. }
  73. BooleanExp* OrExp::Copy() const
  74. {
  75.     return new OrExp(_operand1->Copy(),_operand2->Copy());
  76. }
  77. BooleanExp* OrExp::Replace(const char* name,BooleanExp& exp)
  78. {
  79.     return new OrExp(_operand1->Replace(name,exp),
  80.                       _operand2->Replace(name,exp)
  81.                       );
  82. }
  83. BooleanExp::BooleanExp()
  84. {
  85.     cout<< "A BooleanExp is created."<<endl;
  86. }
  87. BooleanExp::~BooleanExp()
  88. {
  89.     cout<< "A BooleanExp is destoryed."<<endl;
  90. }
  91. Context::Context()
  92. {
  93.     for(int i=0;i<MAX_NUM;i++)
  94.     {
  95.         _name[i]=0;
  96.         _value[i]= false;
  97.     }
  98. }
  99. Context::~Context()
  100. {
  101.     //delete _name;
  102.     cout<<"A context is destroyed"<<endl;
  103. }
  104. bool Context::Lookup(const char* X) const
  105. {
  106.     for (int i =0 ;i<MAX_NUM;i ++)
  107.     {
  108.         if (strcmp (X,_name[i])==0)
  109.             return _value[i];
  110.     }
  111.     return false;
  112. }
  113. void Context::Assign(VariableExp* x,bool z)
  114. {
  115.     int i;
  116.     for (i =0; i<MAX_NUM&&(_name[i]!=0);i ++)
  117.     {
  118.         if (strcmp (x->getname(),_name[i])==0)
  119.              _value[i] = z;
  120.     }
  121.     if (i<MAX_NUM) 
  122.     {
  123.         _name[i]=strdup(x->getname());
  124.         _value[i]=z;
  125.     }
  126. }
main.cpp
  1. #include <iostream>
  2. #include "Interpreter.h"
  3. using namespace std;
  4. int main()
  5. {
  6.     BooleanExp* expression1;
  7.     BooleanExp* expression2;
  8.     Context context;
  9.     VariableExp* x = new VariableExp("X");
  10.     VariableExp* y = new VariableExp("Y");
  11.     expression1 = new AndExp(x,y);
  12.     expression2 = new OrExp(x,y);
  13.     context.Assign(x,false);
  14.     context.Assign(y,true);
  15.     bool result1 = expression1->Evaluate(context);
  16.     bool result2 = expression2->Evaluate(context);
  17.     cout<<"The result1 is " << result1<<endl;
  18.     cout<<"The result2 is " << result2<<endl;
  19.     delete expression1;
  20.     delete expression2;
  21.     delete x;
  22.     delete y;
  23. //  Context* a = new Context;
  24. //delete a;
  25.     return 0;
  26. }
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值