1定义

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

2类图

角色分析

AbstractExpression抽象解释器,具体的解释任务由各个实现类完成,具体的解释器分别由TerminalExpression和NonterminalExpression完成

TerminalExpression终结符表达式,实现与文法中的元素相关的解释操作,通常一个解释器模式中只能有一个终结符表达式,但有多个实例,敌营不同的终结符

NonterminalExpression非终结符,文法中的每条规则对应一个非终结表达式。

Context环境角色,

3实现

#pragma once
#include<stack>
#include<iostream>
using namespace std;
class Object;
class Context;
//抽象表达式 //抽象表达式是生成语法集合/语法树的关键,每个语法集合完成指定语法解析任务,通过递归调用方式完成
class Expression
{
public:
virtual Object* interpreter(Context *ctx) =
{
cout << "If you Can, you Don't" << endl;
return NULL;
};
};
//终结符表达式简单,主要处理场景元素和数据的转换
//终结符表达式
class TerminalExpression :public Expression
{
Object* interpreter(Context*ctx)
{
cout << "TerminalExpression::interpreter" << endl;
return NULL;
}
}; //每个非终结符表达式都表示一个文法规则,每个文法规则又只关心周边文法规则的结果,所以就会有递归调用而存在
//非终结符表达式
class NonterminalExpression :public Expression
{
public:
NonterminalExpression(Expression* x1, ...)
{
for (int i = ; i < ; ++i)
{
_st.push(x1);
}
}
Object *interpreter(Context*ctx)
{
//核心支出在于这里。。进行文法处理,并且产生递归调用
//if(typeid().name() != "TerminalExpression")
//递归调用
//文法处理
while (!_st.empty())
{
Expression* tp = _st.top();
_st.pop();
cout << "NoterminalExpression::interpreter" << endl;
tp->interpreter(ctx);
}
return NULL;
}
private:
stack <Expression*> _st;
};
class Context{
}; class Client
{
public:
void operator()()
{
Context *ctx = new Context();
stack<Expression*> st;
for (int i = ; i < ; ++i)
{
//进行语法判断,并且产生递归调用
st.push(new TerminalExpression());
st.push(new NonterminalExpression(new TerminalExpression()));
}
//for (int i = 0; i < 5; ++i)
//{
// //进行语法判断,并且产生递归调用
// st.push(new NonterminalExpression(new TerminalExpression()));
// st.push(new TerminalExpression());
//}
//产生一个完整的语法树,由各个具体的语法分析进行解析
Expression *exp = st.top();
exp->interpreter(ctx);
}
};

4应用

①优点:是一个简单的语法分析工具,扩展性良好,修改语法只需要修改相对应的非终结符表达式就可以了,扩展语法只需要增加非终结符类即可

②缺点

解释器模式引起类膨胀

采用递归调用方式

效率问题,循环和引用太多

③使用场景

重复发生的事情可以用解释器模式(日志分析等)

一个简单语法需要解释的场景

设计模式--解释器模式C++实现的更多相关文章

  1. Java设计模式----解释器模式

    计算器中,我们输入“20 + 10 - 5”,计算器会得出结果25并返回给我们.可你有没有想过计算器是怎样完成四则运算的?或者说,计算器是怎样识别你输入的这串字符串信息,并加以解析,然后执行之,得出结 ...

  2. JAVA 设计模式 解释器模式

    用途 解释器模式 (Interpreter) 定义一个语言,定义它的文法的一种表示. 并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 解释器模式是一种行为型模式. 结构

  3. 深入浅出设计模式——解释器模式(Interpreter Pattern)

    模式动机 如果在系统中某一特定类型的问题发生的频率很高,此时可以考虑将这些问题的实例表述为一个语言中的句子,因此可以构建一个解释器,该解释器通过解释这些句子来解决这些问题.解释器模式描述了如何构成一个 ...

  4. 设计模式 -- 解释器模式(Interpreter Pattern)

    2015年12月15日00:19:02 今天只看了理论和demo,明天再写文章,跑步好累 2015年12月15日21:36:00 解释器模式用来解释预先定义的文法. <大话设计模式>里面这 ...

  5. C++设计模式——解释器模式

    解释器模式 在GOF的<设计模式:可复用面向对象软件的基础>一书中对解释器模式是这样说的:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子.如 ...

  6. [工作中的设计模式]解释器模式模式Interpreter

    一.模式解析 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 以上是解释器模式的类图,事实上我 ...

  7. C#设计模式——解释器模式(Interpreter Pattern)

    一.概述 在软件开发特别是DSL开发中常常需要使用一些相对较复杂的业务语言,如果业务语言使用频率足够高,且使用普通的编程模式来实现会导致非常复杂的变化,那么就可以考虑使用解释器模式构建一个解释器对复杂 ...

  8. Java设计模式-解释器模式(Interpreter)

    解释器模式是我们暂时的最后一讲,一般主要应用在OOP开发中的编译器的开发中,所以适用面比较窄. Context类是一个上下文环境类,Plus和Minus分别是用来计算的实现,代码如下: public ...

  9. Java设计模式—解释器模式&迭代器模式简介

       解释器模式在实际的系统开发中使用得非常少,因为它会引起效率.性能以及维护等问题,一般在大中型的框架型项目能够找到它的身影,如一些数据分析工具.报表设计工具.科学计算工具等,若你确实遇到" ...

随机推荐

  1. HttpServletRequest获取请求参数中所有的信息

    /** * 获取客户端请求参数中所有的信息 * @param request * @return */ private Map<String, String> getAllRequestP ...

  2. C的指针疑惑:C和指针6(指针)

    NULL: 对所有指针变量进行显式的初始化是种好事:(1)如果你知道指针将被初始化为什么地址,就直接初始化该地址, (2)否则把它初始化位NULL. 注意:假定变量a存储于位置100. × = 看上去 ...

  3. 详解MySQL第三篇—DCL语句

    DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句.这些语句定义了数据库.表.字段.用户的访问权限和安全级别.主要的语句关键字包括 g ...

  4. CentOS 7 安装vsftpd 服务器

    在CentOS7上安装ftp服务器用于保存服务端上传的图片. 1.CentOS卸载vsftpd的方法 如果服务器上已经安装了vsftpd服务,配置出错需要卸载vsftpd服务. 1.1 查找vsftp ...

  5. android上传图片、视频、文件,服务端使用wcf接收

    最近一直在搞android上传图片.视频.文件,服务端使用wcf接收,本文对调试中的遇到的问题进行记录. 首先android上传一些小图片是比较容易的一天下来差不多就能调试出来,但是上传一些大的文件时 ...

  6. 131. Palindrome Partitioning(回文子串划分 深度优先)

    Given a string s, partition s such that every substring of the partition is a palindrome. Return all ...

  7. [转]美国最大婚恋交友网站eHarmony的机器学习实践

    转自:http://www.csdn.net/article/2015-03-19/2824267 上周,我去洛杉矶参加了一个机器学习的meetup,一位主讲是eHarmony公司(美国最大的婚恋交友 ...

  8. zabbix分布式监控系统安装配置

    zabbix简介: zabbix(音同 zæbix)是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵 ...

  9. Hive的Explain命令

    Hive的Explain命令,用于显示SQL查询的执行计划. Hive查询被转化成序列阶段(这是一个有向无环图).这些阶段可能是mapper/reducer阶段,或者是Metastore或文件系统的操 ...

  10. 1.1_Django简介及安装

    Django的安装 Django安装 文档:https://docs.djangoproject.com/en/1.8/ pip install django 可以到这个网站查看可用的django版本 ...