-
意图:
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 -
动机:
-
适用性:
当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时候,可使用解释器模式。 -
结构:
-
参与者:
a. AbstractExpression:
声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。
b. TerminalExpression:
实现与文法中终结符相关联的解释操作。
一个句子中的每个终结符需要该类的一个实例。
c. NonterminalExpression:
对文法中的每一条规则 R : : = R 1 R 2 . . . R n R::= R_1 R_2 ... R_n R::=R1R2...Rn 都需要一个NonterminalExpression类。
为从 R 1 R_1 R1到 R n R_n Rn的每个符号都维护一个AbstractExpression类型的实例变量。
为文法中的非终结符实现解释操作(Interpret)操作。解释(Interpret)一般要递归地调用表示 R 1 R_1 R1到 R n R_n Rn的那些对象的解释操作。
d. Context:
包含解释器之外的一些全局信息。 -
协作:
-
效果:
a. 易于改变和拓展文法
b. 也易于实现文法
c. 复杂的文法难以维护
d. 增加了新的解释表达式的方式 -
实现:
a. 创建抽象语法树
b. 定义解释操作
c. 与Flyweight模式共享终结符 -
代码示例:
public interface AbstractExpression { void interpret(Context context); } public class TerminalExpression implements AbstractExpression { @Override public void interpret(Context context) { System.out.println("TerminalExpression interpret " + context.getExpression()); } } public class NonterminalExpression implements AbstractExpression { @Override public void interpret(Context context) { System.out.println("NonterminalExpression interpret " + context.getExpression()); } } public class Context { private String expression; public Context(String expression) { this.expression = expression; } public String getExpression() { return expression; } public void setExpression(String expression) { this.expression = expression; } } public class Client { public static void main(String[] args) { Context context = new Context("4*4"); AbstractExpression expression = new TerminalExpression(); expression.interpret(context); } }
-
已知应用:
-
相关模式:
Composite模式:抽象语法树是一个复合模式的实例。
Flyweight模式:说明了如何在抽象语法树中共享终结符。
Iterator:解释器可用一个迭代器遍历该结构。
Visitor:可用一个类中维护抽象语法树中的各节点的行为。