통역사 모드


통역사 패턴은 언어의 문법이나 표현을 평가하는 방법을 제공하는 행동 패턴입니다. 이 패턴은 특정 컨텍스트를 해석하는 표현식 인터페이스를 구현합니다. 이 모드는 SQL 구문 분석, 기호 처리 엔진 등에 사용됩니다.

Introduction

의도: 언어가 주어지면 문법적 표현을 정의하고 해당 표현을 사용하여 언어의 문장을 해석하는 통역사를 정의합니다.

주요 솔루션: 일부 고정된 문법에 대한 문장을 해석하는 통역사를 구축하세요.

사용 시기: 특정 유형의 문제가 충분히 자주 발생하는 경우 해당 문제의 개별 사례를 간단한 언어의 문장으로 공식화하는 것이 좋습니다. 이를 통해 이러한 문장을 해석하여 문제를 해결하는 인터프리터를 구축할 수 있습니다.

해결 방법: 구문 트리를 구축하고 터미널 기호와 비 터미널 기호를 정의하세요.

키 코드: 컴포넌트 환경 클래스, 일반적으로 HashMap과 같은 인터프리터 외부의 전역 정보가 포함되어 있습니다.

응용 예: 컴파일러, 연산식 계산.

장점: 1. 확장성과 유연성이 좋습니다. 2. 표현을 해석하는 새로운 방법을 추가했습니다. 3. 간단한 문법을 ​​구현하기 쉽습니다.

단점: 1 사용 가능한 시나리오가 상대적으로 적습니다. 2. 복잡한 문법을 ​​유지하기가 어렵습니다. 3. 통역사 모드를 사용하면 수업이 확장됩니다. 4. 통역사 모드는 재귀 호출 방식을 사용합니다.

사용 시나리오: 1. 해석하고 실행해야 하는 언어의 문장은 추상 구문 트리로 표현될 수 있습니다. 2. 반복되는 일부 문제는 간단한 언어로 표현될 수 있습니다. 3. 간단한 문법 설명이 필요한 시나리오.

참고: 사용 가능한 시나리오가 상대적으로 적습니다. JAVA에서 발생하는 경우 대신 Expression4J를 사용할 수 있습니다.

Implementation

인터페이스 ExpressionExpression 인터페이스를 구현하는 엔터티 클래스를 생성하겠습니다. 컨텍스트에서 기본 해석기 역할을 하는 TerminalExpression 클래스를 정의합니다. 다른 클래스 OrExpression, AndExpression은 결합된 표현식을 만드는 데 사용됩니다.

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단계

출력을 확인합니다.

rreee