设计模式C++描述----21.解释器(Iterpreter)模式

来源:互联网 发布:南风知我意txt下载七微 编辑:程序博客网 时间:2024/04/29 20:44

一. 解释器模式

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

结构如下:


代码如下:

[cpp] view plaincopy
  1. //包含解释器之外的一些全局信息  
  2. class Context   
  3. {   
  4. public:   
  5.     Context() {}  
  6.   
  7.     ~Context() {}  
  8. };  
  9.   
  10.   
  11. class AbstractExpression   
  12. {   
  13. public:   
  14.     virtual ~AbstractExpression() {}  
  15.   
  16.     virtual void Interpret(const Context& c) {}  
  17.   
  18. protected:   
  19.     AbstractExpression() {}  
  20. };  
  21.   
  22. //终结符表达式  
  23. class TerminalExpression:public AbstractExpression   
  24. {  
  25. public:   
  26.     TerminalExpression(const string& statement)  
  27.     {  
  28.         this->_statement = statement;  
  29.     }  
  30.   
  31.     ~TerminalExpression(){}  
  32.   
  33.     void Interpret(const Context& c)  
  34.     {  
  35.         cout<<this->_statement<<" Terminal Expression..."<<endl;   
  36.     }  
  37.   
  38. private:   
  39.     string _statement;   
  40. };  
  41.   
  42. //非终结符表达式      
  43. class NonterminalExpression:public AbstractExpression   
  44. {   
  45. public:   
  46.     NonterminalExpression(const string& statement)  
  47.     {  
  48.         this->_statement = statement;  
  49.     }  
  50.                    
  51.     ~NonterminalExpression() {}  
  52.   
  53.     void Interpret(const Context& c)  
  54.     {  
  55.         cout<<this->_statement<<" Nonterminal Expression..."<<endl;   
  56.     }  
  57.   
  58. private:  
  59.     string _statement;   
  60. };  
  61.   
  62.   
  63. //测试代码  
  64. int main(int argc,char* argv[])  
  65. {   
  66.     Context* c = new Context();  
  67.       
  68.     list<AbstractExpression*> ls;  
  69.   
  70.     ls.push_back(new TerminalExpression("A"));  
  71.     ls.push_back(new NonterminalExpression("B"));  
  72.     ls.push_back(new TerminalExpression("C"));  
  73.     ls.push_back(new NonterminalExpression("D"));  
  74.   
  75.     list<AbstractExpression*>::iterator it = ls.begin();  
  76.     for (it; it != ls.end(); ++it)  
  77.     {  
  78.         (*it)->Interpret(*c);  
  79.     }  
  80.   
  81.     return 0;   
  82. }  

二. 说明

解释器模式就是用“迷你语言”来表现程序要解决的问题。

比如:在C语言解释器,当你输入 int 时,解释器就能正确的开辟一个 int 的空间出来。

再比如: linux 下常用的命令参数,如 ls -a,-a 就能被正确的解释成相应的命令。

优点:这种模式很容易改变和扩展文法,因为每个文法有一个文法类,也就是上面的表达式类。

缺点:当文法非常复杂时,要管理和维护很多个文法类。



转自:http://blog.csdn.net/lwbeyond/article/details/7586797
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 美容店没人进店怎么办 新店开业招不到营业员怎么办 无意开通了花呗怎么办? 花呗灰色用不了怎么办 花呗逾期用不了怎么办 店铺花呗关闭了怎么办 花呗无法使用了怎么办 借呗自动关闭了怎么办 蚂蚁花呗无法开通怎么办 花呗本月还不了怎么办 蚂蚁借呗没钱还怎么办 淘宝账号被限制登录怎么办 辱骂买家被投诉骚扰怎么办 淘宝卖家骚扰买家怎么办 被淘宝卖家电话骚扰怎么办 闲鱼卖东西买家退货运费怎么办 淘宝被恶意拍单怎么办 炒作信用度评价被删除怎么办 删除淘宝评价之后卖家不返现怎么办 美团客户给差评怎么办 淘宝卖家评价差怎么办 淘宝卖家发货未揽收怎么办 周不过5我超过了怎么办 淘宝申请退款后卖家不确认怎么办 淘宝直通车b类扣12分怎么办 淘宝店铺被买家投诉怎么办 淘宝店铺遭买家投诉怎么办 淘宝店铺被买家恶意投诉怎么办 苹果手机无法识别指纹怎么办 淘宝店铺虚假交易违规怎么办 斗鱼直播太卡怎么办 神笔添加视频尺码不符合怎么办 闲鱼卖家单号填错了怎么办 户户通没有信号强度怎么办 全民k歌qq登不上怎么办 手机直播没电了怎么办 淘宝退货卖家拒收怎么办 充的会员卡店家关门了怎么办 淘宝手机号码被注册了怎么办 淘宝不支持七天无理由退货怎么办 微信视频横屏怎么办