INTERPRETER(解释器)

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:维护语法分析树中各节点的行为。

posted @ 2016-07-21 19:38  罗纳尔东  阅读(523)  评论(0编辑  收藏  举报