意图:给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
动机:在软件构建过程中,如果某一特定领域的问题比较复杂类似的机构不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化。
适用性:
当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可是用interpreter模式,当文法简单的时候以及效率不是关键问题的时候使用该模式效果最好。
结构:
参与者:
AbstractExpression: 声明一个抽象的解释操作,这个接口为抽象语法树种所有的结点共享。
TerminalExpression : 实现与文法中的终结符相关联的解释操作;一个句子中的每个终结符需要该类的一个实例
NonterminalExpression : 对文法中的每一条规则R都需要一个NonterminalExpression类;为R的每个符号维护一个AbstractExpression类型的实例变量;为文法中的非终结符实现解释操作。
Context: 包含解释器之外的一些全局变量
Client: 构建表示文法定义的语言中一个特定的句子的抽象语法树;调用解释操作
协作:
Client构建一个句子,他是NonterminalExpression 和TerminalExpression的实例的一个抽象语法树。每一个非终结符表达式结点定义相应子表达式的解释操作。每一结点的解释操作Context来储存和访问解释器的状态。
效果:
易于改变和扩展文法
易于实现文法
复杂的文法难以维护
增加新的解释器表达式的方式。
实现:
代码示例如下:
1 |
|