zoukankan      html  css  js  c++  java
  • 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:维护语法分析树中各节点的行为。

  • 相关阅读:
    [Bzoj2152]聪聪可可
    [2019杭电多校第七场][hdu6655]Just Repeat
    [2019杭电多校第七场][hdu6651]Final Exam
    [2019杭电多校第七场][hdu6646]A + B = C(hash)
    [2019杭电多校第六场][hdu6641]TDL
    [2019杭电多校第六场][hdu6638]Snowy Smile(维护区间最大子段和)
    abc179f
    Codeforces Round #680A
    Codeforces Round #680B
    Codeforces Round #681 D
  • 原文地址:https://www.cnblogs.com/criticalsection/p/5692938.html
Copyright © 2011-2022 走看看