言語のカスタム実装 - インタプリタモード(C)

18.3インタプリタモードの概要

       通訳パターンは学ぶことが困難な比較的低い周波数であるが、オブジェクト指向言語を使用する方法を説明するために使用されているデザインパターンは、単純な言語インタプリタを構成しています。いくつかのケースでは、より良い問題の特定の種類を説明するために、我々は新しい言語を作成することができ、言語は、独自の表現や構造を有している、すなわち文法規則、これらの問題のインスタンスがために対応させていただきます言語で文章。この時点で、あなたは、この新しい言語を設計するために通訳のパターンを使用することができます。学習インタプリタモードでは、中国の法律規則の解釈を習得するために、オブジェクト指向と手続き型プログラミング言語の理解を深めることができます。

       次のようにインタプリタパターンが定義されています。

インタプリタパターン(パターンインタプリタ):言語文法の定義、および「言語」は、文法の形式とコードルールを指す文の言語を解釈するインタプリタを確立します。通訳パターンは、モデルのクラス型です。

       発現はターミネーター発現および非終端記号表現を分割することができるので、構造及び組み合わせモード解釈モードの構造と幾分類似しているが、図に示すように、その構造中に説明モードにおいて複数の構成要素を含む18 -3に示します。

18-3  、図中のインタプリタパターン構成。

       これは、図の解釈モードの構造では、次のいくつかの役割が含まれています。

       ● AbstractExpression(抽象的な表現):抽象的な表現に抽象の動作を説明する文は、それはすべてのターミネータ式と非終端表現の共通の親です。

       ● TerminalExpression(ターミネーター発現):ターミネーターの発現は、各文ターミネータでのクラスの実装は、関連する文法に終端記号の動作を説明する抽象表現のサブクラスでありますインスタンス。通訳通常、ほんの数モードターミネータ表現クラス、例は、より複雑な文章非終端式で構成することができます。

       ● NonterminalExpression(非終端式):式はターミネーター非終端記号表現を含むことができるので、非終端記号表現は、また、終端記号の動作を説明する文法アフリカを実装する抽象表現のサブクラスでありますあなたは、このように一般的に再帰的な方法によって達成されるの動作を説明する、非終端記号表現を含むように継続することができます。

       ● コンテキスト(環境):ストレージ・インタプリタのいくつかのグローバル情報外のため、通常はそれを説明する必要もコンテキストクラスとして知られている環境のクラスは、一時的に文を格納します。

       インタプリタモードでは、端末と非終端記号のそれぞれが原因規制条項の各々を表現するクラスを使用する、対応する具象クラスを有し、システムは、より良好な柔軟性と拡張性を有することになります。全ての端末と非終端記号のために、まず、以下のように一般的なコードであり、一般的抽象スーパークラス、すなわちクラス抽象表現を必要とします。

抽象クラスAbstractExpression {

       パブリック抽象ボイド(コンテキストctx)解釈します;

}

       ターミネーターの発現および発現非終端式クラス、次のようにコードは非常に単純である抽象クラス、発現のためのターミネーター、ターミネーター要素のメイン処理、典型的には、コードのサブクラスです。

クラスTerminalExpressionはAbstractExpressionを{延び

       ます。public void {(コンテキストctxを)解釈

              //式の動作を説明するためのターミネータ

       }

}

       それはクラスの非終端非終端表現することにより、より複雑な構造への可能表現は一般的に以下のコードされている2つの動作要素が含まれているため、コードのための非終端発現のために、比較的複雑です。

クラスNonterminalExpressionはAbstractExpressionを{延び

       プライベートAbstractExpressionは左。

       プライベートAbstractExpression右;

      

       公共NonterminalExpression(AbstractExpressionは、AbstractExpression右を左){

              this.left =左;

              this.rightは右=。

       }

      

       ます。public void {(コンテキストctxを)解釈

              //再帰呼び出し各成分解釈()メソッド

              //接続特定の組成ながら再帰呼び出しの一部、即ち非終端関数

       }     

}

       除了上述用于表示表达式的类以外,通常在解释器模式中还提供了一个环境类Context,用于存储一些全局信息,通常在Context中包含了一个HashMapArrayList等类型的集合对象(也可以直接由HashMap等集合类充当环境类),存储一系列公共信息,如变量名与值的映射关系(key/value)等,用于在进行具体的解释操作时从中获取相关信息。其典型代码片段如下:

class Context {

     private HashMap map = new HashMap();

     public void assign(String key, String value) {

         //往环境类中设值

     }

public String  lookup(String key) {

         //获取存储在环境类中的值

     }

}

       当系统无须提供全局公共信息时可以省略环境类,可根据实际情况决定是否需要环境类。

思考

绘制加法/减法解释器的类图并编写核心实现代码。

发布了25 篇原创文章 · 获赞 1 · 访问量 773

おすすめ

転載: blog.csdn.net/qq_42770949/article/details/104930377