통역사 모드
통역사 패턴은 언어의 문법이나 표현을 평가하는 방법을 제공하는 행동 패턴입니다. 이 패턴은 특정 컨텍스트를 해석하는 표현식 인터페이스를 구현합니다. 이 모드는 SQL 구문 분석, 기호 처리 엔진 등에 사용됩니다.
Introduction
의도: 언어가 주어지면 문법적 표현을 정의하고 해당 표현을 사용하여 언어의 문장을 해석하는 통역사를 정의합니다.
주요 솔루션: 일부 고정된 문법에 대한 문장을 해석하는 통역사를 구축하세요.
사용 시기: 특정 유형의 문제가 충분히 자주 발생하는 경우 해당 문제의 개별 사례를 간단한 언어의 문장으로 공식화하는 것이 좋습니다. 이를 통해 이러한 문장을 해석하여 문제를 해결하는 인터프리터를 구축할 수 있습니다.
해결 방법: 구문 트리를 구축하고 터미널 기호와 비 터미널 기호를 정의하세요.
키 코드: 컴포넌트 환경 클래스, 일반적으로 HashMap과 같은 인터프리터 외부의 전역 정보가 포함되어 있습니다.
응용 예: 컴파일러, 연산식 계산.
장점: 1. 확장성과 유연성이 좋습니다. 2. 표현을 해석하는 새로운 방법을 추가했습니다. 3. 간단한 문법을 구현하기 쉽습니다.
단점: 1 사용 가능한 시나리오가 상대적으로 적습니다. 2. 복잡한 문법을 유지하기가 어렵습니다. 3. 통역사 모드를 사용하면 수업이 확장됩니다. 4. 통역사 모드는 재귀 호출 방식을 사용합니다.
사용 시나리오: 1. 해석하고 실행해야 하는 언어의 문장은 추상 구문 트리로 표현될 수 있습니다. 2. 반복되는 일부 문제는 간단한 언어로 표현될 수 있습니다. 3. 간단한 문법 설명이 필요한 시나리오.
참고: 사용 가능한 시나리오가 상대적으로 적습니다. JAVA에서 발생하는 경우 대신 Expression4J를 사용할 수 있습니다.
Implementation
인터페이스 Expression과 Expression 인터페이스를 구현하는 엔터티 클래스를 생성하겠습니다. 컨텍스트에서 기본 해석기 역할을 하는 TerminalExpression 클래스를 정의합니다. 다른 클래스 OrExpression, AndExpression은 결합된 표현식을 만드는 데 사용됩니다.
InterpreterPatternDemo, 데모 클래스에서는 Expression 클래스를 사용하여 규칙을 만들고 표현식 구문 분석을 보여줍니다.
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