当一个特定类型的问题发生频率足够高, 将该问题的各个实例表述为句子(例如“美利坚...”说多了就是USA),其中的文法规则(如缩写规则)即为解释器。 另一个现实的例子就是话外音。
给定一个语言,定义它的**[1]文法的一种表示**,并定义一个**[2]解释器**,该解释器使用这种表示来解释语言中的句子。
-
定义解释操作
- 可以和Visitor将解释放入一个独立的Visitor对象
-
如何构造抽象文法树
- 构造抽象文法树并不是解释器模式的职责, 其可以用表驱动的语法分析程序或直接(客户)手动分配的方式来提供。
-
对于终结符
- 可以用享元Flyweight共享终结符。
要素
- 抽象表达式AbstractExpression —— 声明一个抽象的解释操作,该接口为抽象语法树中所有的节点共享。
- 环境类Context —— 包含解释器之外的一些全局信息。
- 终结符表达式TerminalExpression
- 实现与文法中的终结符相关的解释操作。
- 实现抽象表达式中所需的解释操作Interpret。
- 文法中每一个终结符都有一个具体的终结表达式与之相对应。
- [可选] 接受Context中的参数配置
- 非终结符表达式NonterminalExpression
- 为文法中的非终结符相关的解释操作, 用来递归地表示中间的解释操作。
- [可选] 接受Context中的参数配置
- 可扩展性好。易于改变和拓展文法
- 易于实现文法
- 增加了新的解释表达式的方式。可以用Visitor来为解释程序增加新的方式。
- 复杂的文法难以维护 ——> 建议使用语法分析程序 或 编译器生成器 等技术。
构建解释器来解决那些频繁发生的某一特定类型的问题。
- 可以将一个需要解释执行的语言中的句子表示为一个抽象语法树;
- 一些重复出现的问题可以用一种简单的语言来进行表达;
- 文法较为简单时。
实现: 正则表达式