《Java设计模式及实践》—3.3 解释器模式

举报
华章计算机 发表于 2019/07/22 13:20:22 2019/07/22
【摘要】 本节书摘来自华章计算机《Java设计模式及实践》一书中的第3章,第3.3节,[印度] 卡马尔米特·辛格(Kamalmeet Singh)[荷兰] 艾德里安·伊恩库列斯库(Adrian Ianculescu) 著[罗马尼亚] 路西安-保罗·托尔耶(Lucian-Paul Torje) 张小坤 黄 凯 贺 涛 译.

3.3 解释器模式

计算机用来解释句子或表达式。当需要编写一系列处理这种需求的代码时,首先要知道句子或表达式的结构,要有一个表达式或句子的内部表示。多数情况下,最合适的结构是基于组合模式的组合结构。我们将在第4章中进一步讨论组合模式。现在可以将组合表示视为将相似性质的对象集合在一起。

1.目的

解释器模式定义语法的表示以及该语法的对应解释。

2.实现

解释器模式使用组合模式来定义对象结构的内部表示。除此之外,它还添加了实现来解释表达式并将其转换为内部结构。因此,解释器模式属于行为型模式。解释器模式的类图如图3-4所示。

 image.png

图 3-4

解释器模式由以下类组成:

  • Context(环境):Context用于封装解释器的全局信息,所有具体的解释器均需访问Context。

  • AbstractExpression(抽象表达式):一个抽象类或接口,声明执行的解释方法,由所有具体的解释器实现。

  • TerminalExpression(终结符表达式):一种解释器类,实现与语法的终结符相关的操作。终结符表达式必须始终被实现和实例化,因为它表示表达式的结尾。

  • NonTerminalExpression(非终结符表达式):这是实现语法的不同规则或符号的类。对于每一个语法都应该创建一个类。

在实践当中,解释器模式用来解释正则表达式。为这种场景实现解释器模式是一个很好的练习,这里我们选择一个简单的语法作为例子。我们将应用解释器模式来解析带有一个变量的简单函数f (x)。

为了简单,我们选择逆波兰表示法,这是一种在运算符末尾添加操作数的表示法。1 + 2变为1 2 +, (1 + 2)* 3变为1 2 + 3 *。优点是不再需要括号,因此它简化了任务。

下面的代码为表达式创建了接口:

 image.png

实现具体类需要下列元素:

  • Number(数字)类:它解释所有数字。

  • Operatorc((操作符)+、-、*、/)类:在下面的例子中,将使用加号(+)和减号(-)。

 image.png

现在到了复杂的部分,我们需要实现操作符类,操作符类是组合表达式,由两个表达式组合而成:

 image.png

类似地,接下来实现一个减号类:

 image.png

image.png

 

可以看到,我们已经创建了一个类,该类允许我们构建一棵这样的语法树:操作是节点,变量和数字是叶子。结构非常复杂,可用于解释表达式。

现在写一段代码,通过建立好的类来实现语法树:

 image.png

 

 image.png

3.适用情况和示例

解释器模式适用于表达式被解释并转换为其内部表示的情况。内部表示是基于组合模式的,因此解释器模式不适用于复杂的语法。

Java在java.util.Parser中实现了解释器模式,它用于解释正则表达式。在解释正则表达式时返回匹配器对象。匹配器使用基于正则表达式的模式类创建的内部结构:

image.png

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。