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

每个文法定义的一般来说是许许多多的表达式构成的。而复杂表达式又会由更细小的表达式构造成。比如: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. 【HDOJ】1726 God’s cutter

    简单DP. /* 1726 */ #include <cstdio> #include <cstring> #include <cstdlib> #define M ...

  2. BZOJ1264: [AHOI2006]基因匹配Match

    1264: [AHOI2006]基因匹配Match Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 541  Solved: 347[Submit][S ...

  3. HDU Sky数 2079 简单易懂的代码

    题目 http://acm.hdu.edu.cn/showproblem.php?pid=2097 思路 既然要求和 十进制数字各个位数上的和是相同的, 那么16,12进制转换完之后也是10进制表示的 ...

  4. datagridview的数据源的操作

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. Java---多线程的加强(1)

    简单应用: 首先来看一个简单的例子: 两个线程,分别实现对1-100内的奇数,偶数的输出. 第一种方法:通过接口 MyRun类: package thread.hello; /** * 通过实现Run ...

  6. Emacs添加主题插件(Win系统)

    Emacs添加主题插件(Win系统) */--> /* @licstart The following is the entire license notice for the JavaScri ...

  7. 【转】SqlLite .Net 4.0 System.IO.FileLoadException”类型的未经处理的异常出现在XXX

    原文地址:http://www.csharpcity.com/2010/sqlite-ado-net-c-4-0/ ---------------------- 解决方法: Paste the fol ...

  8. Topcoder 好题推荐

    SRM SRM147 DIV1 1000pt DP SRM148 DIV1 1100pt 递归 SRM149 DIV1 1000pt math SRM150 DIV1 500pt DP SRM469 ...

  9. java中字符串的比较

    compareTo方法是比较两个字符串的词典顺序  也就是在字典中的顺序,比如“abcd”在“acdb”前面 大于返回1,小于返回-1 equals:比较两字符串的内容是否相同. 相同返回1,不同返回 ...

  10. [原创]python MySQLdb在windows环境下的安装、出错问题以及解决办法

    版权声明:本文为博主原创文章,未经博主允许不得转载. 问题:windows下安装MySQLdb的方法 解析:python没有php那种集成环境,比如wamp那种集成软件直接把所有需要的东西全部一次性搭 ...