Author:Gorit
Date:2021年11月29日
Refer:《图解设计模式》
Times:|
23.1 Interpreter 模式
在 Interpreter 模式中,程序要解决的问题会被用非常简单的“迷你语言”表述出来,即用“迷你语言”编写 “迷你程序”把具体问题表述出来。迷你程序是无法单独工作的,我们还需要用 Java 编写一个 “翻译”程序。程序语言会理解迷你语言,并解释和运行迷你程序。这段翻译程序被称为 “解释器”。这样,当腰解决的问题发生变化时,不需要修改 Java 语言程序,只需要修改迷你语言程序即可应对
23.2 示例程序
一、伪代码程序
本章中 迷你语言 要做的事情是控制 无线玩具车,可以做的事情如下:
- 前进1米后停止(go)
- 右转(right)
- 左转(left)
- 重复(repeat)
伪代码
program go 4 end
program left end
program right end
program repeat 4 go right end end
二、类的一览
类 | 说明 |
---|---|
Node | 表示语法树“节点”的类 |
ProgramNode | 对应 |
CommandListNode | 对应 |
CommandNode | 对应 |
RepeatCommandNode | 对应 |
PrimitiveCommandNode | 对应 |
Context | 表示语法解析上下文的类 |
ParseException | 表示语法解析过程中肯能会发生异常的类 |
Main | 测试程序行为的类 |
源代码在 Github 上 传送门
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 拓展
一、迷你语言还有哪些
- 正则表达式
- 检索表达式
- 批处理语言
二、相关设计模式
- Composite 模式(NoterminalExpression 角色多是递归结构,因此常用 Composite 模式来实现 NoterminalExpression 角色)
- Flyweight 模式(有时会用 Flyweight 模式共享 TerminalExpression 角色)
- Visitor 模式(在推导出语法树后,有时会使用 Visitor 模式来访问语法树的各个节点)