解释器模式意图为给定的语言定义其文法表示,同时定义该文法表示的一套解释器来解释语言中的句子。该模式说的简单通俗点,其主要用途是用来解释用的。至于解释什么,则要看具体的上下文环境。我们可以为一个表达式专门写一个解释器、也可以为一个语句写一个解释器,一个语句可以看成是由多个表达式构成的、因此,我们同样可以为一段文本写个解释器等等。而在要设计实现一个有效的解释器之前,试想下,首先要做的将是要为待解释的表达式进行其文法定义,即:定义其规则。一个先简单的例子,假如用户自己发明了一个脚本语言。如果想要让该语言行之有效,则必需为其定义各种“规则”,如:关键字是什么、表达式格式是什么、语句的构造又是有哪些约定的、如果有面向对象语法,则对象又是如何表示的、...等等,然后再需要实现一个能够识别这些“规则”并能正确解释、运行它们的编译器。

每个文法定义的一般来说是许许多多的表达式构成的。而复杂表达式又会由更细小的表达式构造成。比如:C++中的表达式:(3 + 7) * 15;该表达式可被拆解为:表达式一:(3 + 7);表达式二:15;以及表达式三:表达式一的结果 + 表达式二的结果。其中表达式二是最终不可再拆分的最小粒度表达式,称之为终结符表达式TerminalExpression。而最初整个表达式是可拆分的,它是由其他的子表达式构成的(其实如果该例子写的更复杂一些,则这个说明效果可能会更好),称之为非终结符表达式NoterminalExpression。有学过编译原理的人可能知道,编译器(其实就是一种解释器)的一般都是一种语法树的结构,而该语法树中的叶子其实就是这边的表达式二,非叶子是这边的表达式一或最初的整个表达式。对于一个四则运算的表达式的语法树,一般来说,叶子节点都是具体 的数字值,而连接这些数字值的节点一般是四则运算符,如:+-*/等。解释器模式的类结构图参考如下:

模式编码结构参考如下:

 namespace interpreter
{
// 上下文
class Context {}; // 抽象表达式
class IAbstractExpression
{
public:
// some code here........
virtual void interprete(Context* pContext) {} };//class IAbstractExpression class TerminalExpression
{
public:
// some code here........
virtual void interprete(Context* pContext) { /*some code here........*/ } };//class TerminalExpression class NoterminalExpression
{
public:
// some code here........
virtual void interprete(Context* pContext) { /*some code here........*/ } };//class NoterminalExpression }//namespace interpreter

解释器模式编码结构参考

个人的理解,该模式还是挺复杂庞大的。虽说它的意图表述也就是简简单单地一个文法定义、并定义其解释器。而真要设计起来,其粒度还是会挺细的。就比如一个语言,是需要定义非常非常多的表达式的。一个Boolean就需要一个BooleanExpression、一个与运算也需要一个AndExpression表达式、一个变量需要一个变量表达式、一个加号需要一个表达式、...、最终还需要这些简单表达式的复合表达式。总之,为了能够正确解释上下文,需要做足一切准备,而且还需要前期分析的够透彻,否则,表达式的粒度不够细,则后期复用性不足;表达式的粒度太细,则设计起来,可能又会有冗余。另外,解释器模式,其实与复合模式也是非常像的。甚至可以看成是复合模式的一种特例。只是复合模式的意图是更通用的,表示一种“部分-整体”的关系。

【行为型】Interpreter模式的更多相关文章

  1. Java设计模式(17)解释器模式(Interpreter模式)

    Interpreter定义:定义语言的文法,并且建立一个解释器来解释该语言中的句子. Interpreter似乎使用面不是很广,它描述了一个语言解释器是如何构成的,在实际应用中,我们可能很少去构造一个 ...

  2. Behavioral模式之Interpreter模式

    1.意图 给定一个语言,定义它的文法的一种表示.并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 2.别名 无 3.动机 假设一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各种 ...

  3. 设计模式(二十三)Interpreter模式

    在Interpreter模式中,程序要解决的问题会被用非常简单的“迷你语言”表述出来,即用“迷你语言”编写的“迷你程序”把具体的问题表述出来.迷你程序是无法单独工作的,还需要用java语言编写一个负责 ...

  4. R型思维模式对软件开发的影响(草稿)

    The pragmatic programmers 一直在工作之余读些书,之前主要是纯英文版的计算机相关的算法,编译器,数学等,想通过读这些书来提高自己每日工作效能,结果收效甚微.一是,因为纯英文的书 ...

  5. 行为型---命令模式(Command Pattern)

    命令模式的定义 命令模式属于对象的行为型模式.命令模式是把一个操作或者行为抽象为一个对象中,通过对命令的抽象化来使得发出命令的责任和执行命令的责任分隔开.命令模式的实现可以提供命令的撤销和恢复功能. ...

  6. 行为型-命令模式(Command)

    装修新房的最后几道工序之一是安装插座和开关,通过开关可以控制一些电器的打开和关闭,例如电灯或者排气扇.在购买开关时,我们并不知道它将来到底用于控制什么电器,也就是说,开关与电灯.排气扇并无直接关系,一 ...

  7. WebLogic Server 12.1.2后的字符型安装模式

    weblogic Server 12.1.1全部都可以用原来方式. WebLogic Server 12.1.2后已经取消了console安装模式,目前只有gui和静默安装模式.并且安装方式下也有很大 ...

  8. 成长型思维模式Not yet

    当做一件事失败了,要告诉他 暂未成功,暂时没有成功,继续努力,下次就有可能成功. 不及格,暂未及格  是两种思维模式,成长性的思维方式得到的是一个是努力型的人格

  9. JAVA设计模式(01):创建型-工厂模式【工厂方法模式】(Factory Method)

    简单工厂模式尽管简单,但存在一个非常严重的问题.当系统中须要引入新产品时,因为静态工厂方法通过所传入參数的不同来创建不同的产品,这必然要改动工厂类的源码,将违背"开闭原则".怎样实 ...

随机推荐

  1. 使用dom4j 读取XML文件

    第一次接触dom4j的时候,感觉这个东西很神秘,因为之前虽然知道XML文件吧,但从来没有用过,一直感觉XML肯定不好操作.当得知,dom4j可以很容易的操作读取XML文件时,不免有些好奇,那么,用do ...

  2. fg bg 等命令

    fg.bg.jobs.&.ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的 一.& 最经常被用到 这个用在一个命令的最后,可以把这个命令 ...

  3. Python核心编程 练习

    2–9.循环和运算符 创建一个包含五个固定数值的列表或元组,输出他们的平均值.本练习的难点之一是通过除法得到平均值. 你会发现整数除会截去小数,因此你必须使用浮点除以得到更精确的结果. float() ...

  4. HDU_2544——最短路,Dijkstra模版

    Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要 ...

  5. Cantor表(中等)

    2 3 1/2 2/1 题目分析 这是NoI的一道题目,不过题目比较有创意也比较适合新生,就是一道简单的找规律的题目,首先找到第N个数应该在第几个斜行,然后判断这一行是奇数还是偶数,偶数分母递减,分子 ...

  6. Mysql 5.6主从同步配置与解决方案

    主库IP:192.168.1.10 从库IP:192.168.1.11 centos的mysql配置文件在:/etc/my.cnf 1.主库配置编辑my.cnf: # 启用二进制日志 log_bin ...

  7. 【科研论文】W5100在远程电力质量监测设备中的应用

    摘要: 针对传统电力质量监测方法实时性.多参数测试性能较差的缺点,提出了将以太网接入技术与电能采集相结合进行电力质量现场和远程在线监测的设计方案.硬件设计采用微控制器STM32FI03和以太网控制芯片 ...

  8. 数字信号处理Day2-小波基与规范正交化

    我们有这么一张灰度图64*64 我们能够定义出4096个基,各自是某一位是0其它是1,在这样的情况下,假设我们传输图片,那么就相当于传输原始数据 如果传到一半,网络坏了. 于是,我们得到 我们能够计算 ...

  9. cocos2d-x 2.2.3 之菜单分析(1)

    TextEdit-Menu CCtextFieldTTF cocos2d – x 中提供的 bool T04ZORDER::init() { if (!CCLayer::init()) { retur ...

  10. 生成唯一的id(转)

    很多朋友都利用md5()来生成唯一的编号,但是md5()有几个缺点:1.无序,导致数据库中排序性能下降.2.太长,需要更多的存储空间.其实PHP中自带一个函数来生成唯一的id,这个函数就是uniqid ...