Author:Gorit
Date:2021年11月29日
Refer:《图解设计模式》
Times:|

23.1 Interpreter 模式

在 Interpreter 模式中,程序要解决的问题会被用非常简单的“迷你语言”表述出来,即用“迷你语言”编写 “迷你程序”把具体问题表述出来。迷你程序是无法单独工作的,我们还需要用 Java 编写一个 “翻译”程序。程序语言会理解迷你语言,并解释和运行迷你程序。这段翻译程序被称为 “解释器”。这样,当腰解决的问题发生变化时,不需要修改 Java 语言程序,只需要修改迷你语言程序即可应对

本节我们将实现一个简单的语法解析器

23.2 示例程序

一、伪代码程序

本章中 迷你语言 要做的事情是控制 无线玩具车,可以做的事情如下:

  1. 前进1米后停止(go)
  2. 右转(right)
  3. 左转(left)
  4. 重复(repeat)

伪代码

  1. program go 4 end
  2. program left end
  3. program right end
  4. program repeat 4 go right end end

二、类的一览

说明
Node 表示语法树“节点”的类
ProgramNode 对应 的类
CommandListNode 对应 的类
CommandNode 对应 的类
RepeatCommandNode 对应 的类
PrimitiveCommandNode 对应 的类
Context 表示语法解析上下文的类
ParseException 表示语法解析过程中肯能会发生异常的类
Main 测试程序行为的类

源代码在 Github 上 传送门

上面是输入的语法,先是解析出来的内容
image.png

23.3 Interpreter 中登场的角色

一、AbstractExpression(抽象表达式)

AbstractExpression 角色定义了语法树节点的共同接口(API)。

由 Node 扮演此角色,共同的 API 是 parse

二、TerminalExpression(终结符表达式)

TerminalExpression角色对应 BNF 中终结符表的表达式。示例程序中由 PrimitiveCommandNode 类扮演此角色

三、NonterminalExpression(非终结符表达式)

NotterminalExpression 角色对应非终结符表达式。

由 ProgramNode、CommandNode、RepeatNode、CommandListNode 类扮演此角色

四、Context(文脉、上下文)

Context 角色为解释器进行语法解析提供了必要的信息

五、Client(请求者)

为了推导语法树,Client 角色会调用 TerminalExpression 角色 和 NoterminalExpression 角色

23.4 拓展

一、迷你语言还有哪些

  1. 正则表达式
  2. 检索表达式
  3. 批处理语言

二、相关设计模式

  • Composite 模式(NoterminalExpression 角色多是递归结构,因此常用 Composite 模式来实现 NoterminalExpression 角色)
  • Flyweight 模式(有时会用 Flyweight 模式共享 TerminalExpression 角色)
  • Visitor 模式(在推导出语法树后,有时会使用 Visitor 模式来访问语法树的各个节点)