通訳モード


インタープリター パターンは、言語の文法や表現を評価する方法を提供します。これは動作パターンです。このパターンは、特定のコンテキストを解釈する式インターフェイスを実装します。このモードは、SQL 解析、シンボル処理エンジンなどで使用されます。

はじめに

目的: 与えられた言語、その文法表現を定義し、その言語の文を解釈するためにその表現を使用するインタプリタを定義します。

主な解決策: いくつかの固定文法の文を解釈するインタープリターを構築します。

いつ使用するか: 特定の種類の問題が頻繁に発生する場合は、その問題の個々のインスタンスを簡単な言語で文として定式化する価値があるかもしれません。これにより、これらの文を解釈して問題を解決するインタプリタを構築することが可能になります。

解決方法: 構文ツリーを構築し、終端記号と非終端記号を定義します。

キーコード: コンポーネント環境クラス。インタープリターの外部にあるグローバル情報 (通常は HashMap) が含まれます。

応用例: コンパイラ、演算式計算。

利点: 1. 優れた拡張性と柔軟性。 2. 式を解釈する新しい方法を追加しました。 3. 簡単な文法を実装するのが簡単。

短所: 1. 利用可能なシナリオが比較的少ない。 2. 複雑な文法を維持するのが難しい。 3. インタプリタモードによりクラス拡張が発生します。 4. インタプリタモードは再帰呼び出し方式を採用しています。

使用シナリオ: 1. 解釈して実行する必要がある言語の文は、抽象構文ツリーとして表現できます。 2. 繰り返し発生する問題の中には、簡単な言語で表現できるものもあります。 3. 簡単な文法の説明が必要なシナリオ。

注: JAVA でこの問題が発生した場合は、代わりに Expression4J を使用できます。

実装

インターフェースExpressionと、Expressionインターフェースを実装するエンティティクラスを作成します。コンテキスト内でメインのインタープリターとして機能する TerminalExpression クラスを定義します。他のクラス OrExpressionAndExpression は、結合された式を作成するために使用されます。

InterpreterPatternDemo のデモ クラスは、Expression クラスを使用してルールを作成し、式の解析を示します。

interpreter_pattern_uml_diagram.jpg

ステップ 1

式インターフェースを作成します。

Expression.java

public interface Expression {
   public boolean interpret(String context);
}

ステップ 2

上記のインターフェイスを実装するエンティティ クラスを作成します。

TerminalExpression.java

public class TerminalExpression implements Expression {
	
   private String data;

   public TerminalExpression(String data){
      this.data = data; 
   }

   @Override
   public boolean interpret(String context) {
      if(context.contains(data)){
         return true;
      }
      return false;
   }
}

OrExpression.java

public class OrExpression implements Expression {
	 
   private Expression expr1 = null;
   private Expression expr2 = null;

   public OrExpression(Expression expr1, Expression expr2) { 
      this.expr1 = expr1;
      this.expr2 = expr2;
   }

   @Override
   public boolean interpret(String context) {		
      return expr1.interpret(context) || expr2.interpret(context);
   }
}

AndExpression.java

public class AndExpression implements Expression {
	 
   private Expression expr1 = null;
   private Expression expr2 = null;

   public AndExpression(Expression expr1, Expression expr2) { 
      this.expr1 = expr1;
      this.expr2 = expr2;
   }

   @Override
   public boolean interpret(String context) {		
      return expr1.interpret(context) && expr2.interpret(context);
   }
}

ステップ 3

InterpreterPatternDemo Expression クラスを使用する ルールを作成するそしてそれらを解析します。

InterpreterPatternDemo.java

public class InterpreterPatternDemo {

   //规则:Robert 和 John 是男性
   public static Expression getMaleExpression(){
      Expression robert = new TerminalExpression("Robert");
      Expression john = new TerminalExpression("John");
      return new OrExpression(robert, john);		
   }

   //规则:Julie 是一个已婚的女性
   public static Expression getMarriedWomanExpression(){
      Expression julie = new TerminalExpression("Julie");
      Expression married = new TerminalExpression("Married");
      return new AndExpression(julie, married);		
   }

   public static void main(String[] args) {
      Expression isMale = getMaleExpression();
      Expression isMarriedWoman = getMarriedWomanExpression();

      System.out.println("John is male? " + isMale.interpret("John"));
      System.out.println("Julie is a married women? " 
      + isMarriedWoman.interpret("Married Julie"));
   }
}

ステップ 4

出力を確認します。

りー