1 意图:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
2 动机:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。
构建一个解释器,解释这些句子来解决问题。
3 适用性:
当一个语言需要解释执行,并且你可以将该语言中的句子表示为一个抽象的语法分析树时,可使用解释器模式。
效果最好情况:
.文法的类层次变得庞大而无法管理。此时语法分析程序生成器这样的工具是更好的选择。无需构建语法分析树即可解释表达式,节省时间和空间。
.效率不是一个关键问题,最高效的解释器不是通过直接解释语法分析树实现的,而是先转换为另外的形式。
4 参与者:
.AbstractExpression:声明一个抽象的解释操作,这个接口为抽象语法树中所有节点所共享。
.TerminalExpression:实现与文法中的终结符相关联的解释操作。一个句子中的每个终结符需要该类的一个实例。
.NonterminalExpression:对文法中的每一条规则R::=R1R2...Rn都需要一个NonterminalExpression
为从R1到Rn的每个符号都维护一个AbstrationExpression类型的实例变量。
实现Interpret操作,递归调用表示R1到Rn的那些对象的解释操作。
.Context:
包含解释器之外的一些全局信息
.Client:
构建抽象语法树。调用解释操作
5 协作:
.Client:构建一个句子,它是NonterminalExpression和TerminalExpression的实例的一个抽象语法树。然后初始化上下文调用解释操作。
.每一个非终结符表达式节点定义相应子表达式的解释操作。而各终结符表达式的解释操作构成了递归的基础。
.每一节点的解释操作用上下文来存储和访问解释器的状态
6 效果:
1)易于改编和扩展
2)也易于实现文法
3)复杂的文法难以维护
4)增加了新的解释表达式的方式
7 实现:
Interpreter和Composite实现相通。
1)创建抽象语法树 解释器不创建语法树。可以由编译器生成或手动创建,或客户提供。
2)定义解释操作:
并不一定要在解释表达式类中定义解释操作,如果经常创建新的解释器,那么用Visitor模式将一个解释器放入一个独立的访问者对象中。
3)与Flyweight模式共享终结符:
8 相关模式:
Composite模式:抽象语法树是一个复合模式的实例
Flyweight:如何在抽象语法树中共享终结符
Iterator:解释器可以用一个迭代器遍历该结构
Visitor:维护语法分析树中各节点的行为。