Chinaunix首页 | 论坛 | 博客
  • 博客访问: 164636
  • 博文数量: 60
  • 博客积分: 15
  • 博客等级: 民兵
  • 技术积分: 638
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-26 10:59
个人简介

喜欢coding,因为那是一件伟大的事情,是将无生命的IC赋予灵魂的过程,让我拥有了和上帝一样的成就感。(w1c2g3@163.com)

文章分类

全部博文(60)

文章存档

2017年(7)

2016年(41)

2015年(1)

2014年(4)

2013年(7)

我的朋友

分类: C/C++

2016-10-30 23:15:12

解释器模式 为语言创建解释器




  1. #include <iostream>
  2. #include <string>

  3. using namespace std;

  4. struct Expression {
  5.     virtual bool interpret(string context) = 0;
  6. };

  7. struct TerminalExpression : public Expression {
  8. public:
  9.     TerminalExpression(string data){
  10.         this->data = data;
  11.     }
  12.     virtual bool interpret(string context) {
  13.         string::size_type idx = context.find(data);
  14.         if (idx != string::npos){
  15.             return true;
  16.         }
  17.         return false;
  18.     }

  19. private:
  20.     string data;
  21. };

  22. struct OrExpression : public Expression {
  23. public:
  24.     OrExpression(Expression *expr1, Expression *expr2) {
  25.         this->expr1 = expr1;
  26.         this->expr2 = expr2;
  27.     }
  28.     virtual bool interpret(string context) {        
  29.         return expr1->interpret(context) || expr2->interpret(context);
  30.     }
  31. private:
  32.     Expression *expr1;
  33.     Expression *expr2;
  34. };

  35. struct AndExpression : public Expression {
  36. public:
  37.     AndExpression(Expression *expr1, Expression *expr2) {
  38.         this->expr1 = expr1;
  39.         this->expr2 = expr2;
  40.     }
  41.     virtual bool interpret(string context) {        
  42.         return expr1->interpret(context) && expr2->interpret(context);
  43.     }
  44. private:
  45.     Expression *expr1;
  46.     Expression *expr2;
  47. };

  48. Expression *getMaleExpression(){
  49.   Expression *robert = new TerminalExpression("Robert");
  50.   Expression *john = new TerminalExpression("John");
  51.   return new OrExpression(robert, john);        
  52. }

  53. Expression *getMarriedWomanExpression() {
  54.   Expression *julie = new TerminalExpression("Julie");
  55.   Expression *married = new TerminalExpression("Married");
  56.   return new AndExpression(julie, married);        
  57. }

  58. int main(int argc, char **argv) {
  59.     Expression *isMale = getMaleExpression();
  60.     Expression *isMarriedWoman = getMarriedWomanExpression();

  61.     cout << "John is male? " <<
  62.         isMale->interpret("John") << endl;
  63.     cout << "Julie is a married women? " <<
  64.         isMarriedWoman->interpret("Married Julie") << endl;
  65. }

阅读(779) | 评论(0) | 转发(0) |
0

上一篇:蝇量模式

下一篇:备忘录模式

给主人留下些什么吧!~~