• 设计模式之二十三:解释器模式


    解释器模式:
    给定一个语言,定义了它的文法的一种表示,并定义了一个解释器,这个解释器使用该表示来解释语言中的句子。
    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;
    }   
    
    
    
    

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

  • 相关阅读:
    mysql-5.7 show engine innodb status 详解
    mysql-5.7 saving and restore buffer pool state 详解
    mysql-5.7 监控innodb buffer pool load 的进度 详解
    python3 functools partial 用于函数的包装器详解
    mysql-5.7 innodb change buffer 详解
    mysqlbackup 重建带有gtid特性的slave
    将python图片转为二进制文本的实例
    nginx: [error] invalid PID number "" in "/run/nginx.pid"
    ubuntu中执行定时任务crontab
    Matplotlib:mpl_toolkits.mplot3d工具包
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5093575.html
Copyright © 2020-2023  润新知