23デザインモード第15章:Javaインタープリターモード
定義:言語が与えられ、その文法の表現を定義し、表現を使用して言語の文を解釈する通訳を定義します。
タイプ:行動パターン
クラス図:
インタープリターモードは比較的まれに使用されないモードであり、このモードをこれまで使用したことがありません。インタープリターモードを見てみましょう。
インタープリターモードの構造
抽象通訳者:すべての具体的な表現を実装する抽象インターフェイス(または要約クラス)を宣言します。インターフェイスは、主に説明操作と呼ばれる解釈()メソッドです。特定の解釈タスクは、さまざまな実装クラスによって完了し、特定のインタープリターはターミネーターインタープリターターミナルエクスポンションと非末端インタープリターの非末端発現によって完了します。
ターミネーター式:文法の要素に関連する解釈操作を実装します。通常、通訳パターンにはターミネーター式は1つだけですが、異なるターミネーターに対応する複数のインスタンスがあります。ターミネーターの半分は、文法の操作ユニットです。たとえば、R1とR2がターミネーターである単純な式R = R1+R2があり、R1とR2を解析する対応する通訳者がターミネーターです。
非末端表現:文法の各ルールは、非末端式に対応します。非末端式は、一般に、文法のオペレーターまたはその他のキーワードです。たとえば、式r = r1 + r2では、 +は非末端特性であり、解析 +の通訳は非末端特性です。非末端式は、論理の複雑さに応じて増加し、原則として各文法ルールは非末端式に対応します。
環境の役割:この役割のタスクは、一般に、r = r1+r2などの文法内の各ターミネーターに対応する特定の値を保存するために使用されます。 100をR1に、200をR2に割り当てます。この情報は、環境の役割に保存する必要があります。多くの場合、MAPを使用して、環境の役割で十分に機能します。
コード実装
クラスコンテキスト{}要約クラス式{public abstract object interpreter(Context ctx); } class TerminalExpressionは式を拡張します{public Object interpreter(Context ctx){return null; }} class nonterminalExpressionは式{public nonterminalExpression(式... expressions){} public object interpreter(context ctx){return null; }} public class client {public static void main(string [] args){string expression = ""; char [] chararray = expression.tochararray();コンテキストctx = new Context(); stack <expression> stack = new stack <expression>(); for(int i = 0; i <chararray.length; i ++){//構文判断を下し、再帰的に呼び出す}式exp = stack.pop(); Exp.Interpreter(CTX); }}文法の再帰のコード部分は、特定の状況に従って実装する必要があるため、コードに反映されていません。抽象式は、文法コレクションを生成するための鍵です。各非末端発現は最小限の構文ユニットを解釈し、これらの構文ユニットを完全な文法に再帰的に組み合わせます。これが通訳パターンです。
インタープリターモードの利点と短所
インタープリターは、シンプルな構文分析ツールです。その最も重要な利点は、その拡張性です。構文ルールを変更するには、対応する非末端文字を変更する必要があります。構文を拡張する場合、非末端文字を追加するだけです。
ただし、通訳パターンによりクラスが拡大され、各構文は非末端式を生成する必要があります。構文ルールが比較的複雑な場合、多数のクラスファイルが生成される可能性があり、メンテナンスに多くの問題が発生します。同時に、再帰コール方法が採用されるため、各非末端発現はそれ自体に関連する式のみを気にします。各式は最終結果を知る必要があり、再帰的でなければなりません。オブジェクト指向の言語であろうとプロセス指向の言語であろうと、再帰は推奨されない方法です。多くのループと再帰の使用により、効率は無視できない問題です。特に、解析の複雑で長い構文を解釈するために使用される場合、効率は耐えられません。
インタープリターモードに適用されるシナリオ
次の場合には、インタープリターモードを使用できます。
SQLステートメントなど、単純な構文ルールがあります。 SQLステートメントに基づいてRM変換を実行する必要がある場合は、インタープリターパターンを使用してステートメントを解釈できます。
追加、減算、乗算、分割の4つの操作など、いくつかの反復的な問題ですが、数式は毎回異なります。 A+BC*D、時には*B+CDなどである場合があります。式は絶えず変化していますが、それらはすべて、加算、減算、乗算、および分割の4つの非末端文字によって接続されています。この時点で、インタープリターモードを使用できます。
注意すべきこと
インタープリターモードは、維持するには面倒すぎるため、実際にはまれに使用されないモードです。多くの非ターミナル通訳者が事前に文法のルールに精通していない場合、または文法が特に簡単である場合、その論理を理解することは困難であると想像してください。インタープリターモードは、効率、パフォーマンス、メンテナンスなどの問題を引き起こす可能性があるため、実際のシステム開発ではめったに使用されません。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。