设计模式之二十三:解释器模式-阿里云开发者社区

开发者社区> 技术mix呢> 正文

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

简介:
+关注继续查看

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



运行输出: 










本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5093575.html,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Salesforce mainframe UI的源代码
Salesforce mainframe UI的源代码
4 0
多线程从入门到入坟(面试吹牛逼专用)
提高程序执行效率,比如多线程读取、写入文档等等(摊牌了,我生产中没用过,但这不妨碍我吹牛逼);
5 0
高频面试题-请聊一下Spring中BeanFactory与FactoryBean的区别!
熟练掌握Spring,并对Spring源码有一定的见解(或者是读过Spring源码),无法避免的就是要问几个问题。IOC的实现原理是什么? AOP底层是如何实现的? 因为这些基本上都是面试必然要准备的题目,如果你能粗略的说上一些来,就可能会问一些Spring中使用到的接口,就比如今天我们要说的BeanFactory和FactoryBean有什么不一样(区别)。
14 0
大白话工厂模式及使用场景
设计模式共23种,按功能可以分为创建型、结构型、行为型,工厂模式属于创建型模式,主要用于创建对象
6 0
Angular 开发中的 Source Map
Angular 开发中的 Source Map
4 0
Java 的核心目的和并发编程
Java 的核心目的和并发编程
6 0
Web 应用客户端渲染和服务器端渲染的比较
Web 应用客户端渲染和服务器端渲染的比较
6 0
JavaScript 引擎和 Just-in-Time 编译概念,Hot Function 的简单介绍
JavaScript 引擎和 Just-in-Time 编译概念,Hot Function 的简单介绍
5 0
为什么 Web 开发人员需要学习一个 JavaScript 框架?
为什么 Web 开发人员需要学习一个 JavaScript 框架?
3 0
搞清楚java中的PO、VO、DAO、BO、DTO、POJO
我们界面上只要显示10个字段,客户端用WEB service来获取数据,没有必要把整个PO对象传递到客户端,这时我们就可以用只有这10个属性的DTO来传递结果到客户端,这样也不会暴露服务端表结构。
4 0
+关注
2704
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载