首页 > 其他 > 详细

设计模式~解释器

时间:2020-10-07 10:18:40      阅读:31      评论:0      收藏:0      [点我收藏+]

解释器模式是类的行为模式。

给定一个语言后,解释器模式可以定义出其文法的一种表示,

并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。

语言、解释器和浏览器

解释器模式只描述解释器是怎么工作的,并不指名怎样在运行时创建新的解释器。

虽然广义的将,解释器不一定要有一个浏览器,但是使用浏览器仍然是最常见的建立解释器的办法。

一个浏览器可以从一个文件或命令行读入文字性命令,并创建解释器。

浏览器的工作就是将一个文字性语言翻译成为等效的解释器语言。因此,解释器往往需要浏览器。

解释器模式的结构

技术分享图片

 

 模式涉及的角色:

1. 抽象表达式角色(Expression): 声明一个所有的具体表达式角色都需要实现的抽象接口。这个接口主要是一个 interpret()方法,称作解释操作。

2. 终结符表达式角色(Terminal Expression): 这是一个具体角色。

  • 实现了抽象表达式角色所要求的接口,主要是一个 interpret() 方法;
  • 文法中的每一个终结符都有一个具体终结表达式与之对应。

3. 非终结符表达式角色(Nonterminal Expression): 这是一个具体角色。

  • 文法中的每一条规则 R = R1R2...Rn都需要一个具体的非终结表达式类;
  • 对每一个R1R2...Rn中的符号都持有一个静态类型为Expression的实例变量;
  • 实现解释操作,即 interpret() 方法。解释操作以递归方式调用上面所提到的代表 R1R2...Rn中的各个符号的实例变量。

4. 客户端角色(Client): 代表模式的客户端有以下功能:

  • 建造一个抽象语法树(AST或者Abstract Syntax Tree);
  • 调用解释操作 interpret()。

在一般情况下,模式还需要一个环境角色。

5. 环境角色(Context): 提供解释器之外的一些全局信息,比如变量的真实量值等。

一个示意性实现

这里给出一个最简单的文法和对应的解释器模式的实现,这个简单文法如下:

技术分享图片

 抽象语法树(AST)的每一个节点都代表一个语句,而在每一个节点上都可以执行解释方法。

解释器模式系统的结构图:

技术分享图片

 

首先,抽象表达式角色(Expression)声明了由三个方法组成的接口,其中最重要的就是解释操作方法 interpret() 方法。

其次是终结表达式角色:Constant, Variable。

再次是非终结表达式角色:And, Or, Not

And非终结表达式代表一个二元运算,运算的文法是R = R1R2,或者 Expression ‘And’ Expression,

因此,它会有两个合成的关系指向Expression类。

Or非终结表达式也是一个二元运算,运算的文法是R=R1R2,或者 Expression ‘Or‘ Expression,

因此,它也有两个合成关系指向Expression类。

Not非终结表达式代表一个一元运算,文法 R=R1,或者 ‘Not’ Expression,因此它只有一个合成关系指向Expression类。

源码:

 

设计模式~解释器

原文:https://www.cnblogs.com/Vincent-yuan/p/13776340.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!