zoukankan      html  css  js  c++  java
  • 设计模式之二十三:解释器模式

    解释器模式:
    给定一个语言,定义了它的文法的一种表示,并定义了一个解释器,这个解释器使用该表示来解释语言中的句子。
    Given a language, define a representation for its grammar along with an interpreter that uses the representation to interpret sentences in the language.

    UML图:
    这里写图片描写叙述

    主要包括:

    1. AbstractExpression:声明了一个运行操作的接口。
    2. TerminalExpression:终结符表达式。实现与文法中终结符相关联的操作。
    3. NonterminalExpression:非终结符表达式,为文法中非终结符实现解释操作。

      对文法中的每一条规则R1,R2,R3…..都须要一个详细的非终结符表达式类。

    4. Context:包括解释器外的一些全局信息。

    5. Client:定义了一个抽象的语法树,这棵语法树用来表示语言中特定的句子。语法树由NonterminalExpression和TerminalExpression构成。

    C++实现:

    #include <iostream>
    #include <list>
    
    using namespace std;
    
    class Context
    {
    };
    
    class AbstractExpression
    {
            public:
                    virtual void interpret(Context * c)=0;
    };
    
    class TerminalExpression:public AbstractExpression
    {
            public:
                    void interpret(Context *c)
                    {
                        cout<<"TerminalExpression interpret"<<endl;
                    }
    
    };
    
    class NonTerminalExpression:public AbstractExpression
    {
            public:
                    void interpret(Context *c)
                    {
                        cout<<"NonTerminalExpression interpret"<<endl;
                    }
    };
    
    int main()
    {
        cout<<"解释器模式代码"<<endl;
        list<AbstractExpression *> lists;
        Context *c=new Context;
    
        AbstractExpression * te1=new TerminalExpression();
        lists.push_back(te1);
    
        AbstractExpression * te2=new TerminalExpression();
        lists.push_back(te2);
    
        AbstractExpression * te3=new TerminalExpression();
        lists.push_back(te3);
    
        AbstractExpression * te4=new TerminalExpression();
        lists.push_back(te4);
    
        AbstractExpression * nte1=new NonTerminalExpression();
        lists.push_back(nte1);
    
        list<AbstractExpression*>::iterator iter=lists.begin();
        for(;iter!=lists.end();iter++)
        {
            (*iter)->interpret(c);
        }
    
        delete c;
        delete te1;
        delete te2;
        delete te3;
        delete te4;
        delete nte1;
    
        return 0;
    }   
    
    
    
    

    运行输出:
    这里写图片描写叙述

  • 相关阅读:
    elementUI 表格分页后台排序记录
    oracle乱码记录
    JavaScript 数字转汉字+element时间选择器快速选择
    js中call()方法和apply方法的使用
    Rails导出CSV
    CakePHP2.x 发送邮件
    一个例子说明substr(), mb_substr() 和 mb_strcut()之间的区别
    substr是不安全的
    CakePHP中回调函数的使用
    cakephp中find('list')的使用
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5093575.html
Copyright © 2011-2022 走看看