정의 : 언어가 주어지고 문법의 표현을 정의하고 표현을 사용하여 언어의 문장을 해석하는 통역사를 정의하십시오.
유형 : 행동 패턴
클래스 다이어그램 :
인터프리터 모드는 비교적 드물게 사용되는 모드이며 이전에는이 모드를 사용한 적이 없습니다. 통역사 모드를 살펴 보겠습니다.
통역 모드의 구조
초록 통역사 : 모든 콘크리트 표현이 구현 될 초록 인터페이스 (또는 추상 클래스)를 선언합니다. 인터페이스는 주로 설명 작업이라고하는 해석 () 메소드입니다. 특정 해석 작업은 다양한 구현 클래스에 의해 완료되며, 특정 통역사는 각각 터미네이터 통역 인 TerminalExpression 및 비 터미널 통역사 비 말단 신 발현에 의해 완료됩니다.
터미네이터 표현식 : 문법의 요소와 관련된 해석 작업을 구현합니다. 일반적으로 통역사 패턴에는 하나의 터미네이터 표현식이 있지만 다른 터미네이터에 해당하는 여러 인스턴스가 있습니다. 터미네이터의 절반은 문법의 작동 장치입니다. 예를 들어, R1과 R2가 종말기이고, R1 및 R2를 구문 분석하는 해당 통역사는 터미네이터 인 간단한 공식 r = r1+r2가 있습니다.
비 말단 발현 : 문법의 각 규칙은 비 말단 발현에 해당합니다. 비 터미널 표현은 일반적으로 문법의 운영자 또는 기타 키워드입니다. 예를 들어, 공식 r = r1 + r2에서 +는 비 말단 문자이며, 구문 분석 +의 통역사는 비 말단 문자입니다. 비 말단 표현은 논리의 복잡성에 따라 증가하고 원칙적으로 각 문법 규칙은 비 말단 발현에 해당합니다.
환경 역할 :이 역할의 과제는 일반적으로 r = r1+r2와 같은 문법에 각 종말기에 해당하는 특정 값을 저장하는 데 사용됩니다. 우리는 100을 R1, 200에서 R2로 할당합니다. 이 정보는 환경 역할에 저장해야합니다. 대부분의 경우, 우리는 환경 역할이 충분하기 때문에 MAP를 사용합니다.
예
추가, 뺄셈, 곱셈 및 분할의 예를 들어 보겠습니다. 구현 아이디어는 "Java and Pattern"의 예에서 비롯됩니다. 각 역할의 기능은 위에서 언급 한 사양에 따라 구현됩니다.
// 컨텍스트 (환경) 역할, 해시 맵을 사용하여 변수 클래스 컨텍스트에 해당하는 숫자 값을 저장합니다 {private map valuemap = new Hashmap (); public void addValue (variable x, int y) {Integer yi = new Integer (y); Valuemap.put (x, yi); } public int lookupvalue (variable x) {int i = ((integer) valuemap.get (x)). intvalue (); 반환 i; }} // 초록 표현식 역할, 인터페이스를 사용하여 추상 클래스 표현식을 구현할 수도 있습니다. } // 터미네이터 표현식 역할 클래스 상수는 표현식을 확장합니다. {private int i; 공개 상수 (int i) {this.i = i; } public int 해석 (Context Con) {return i; }} 클래스 변수 확장 extress {public int rard (context con) {// 이것은 해석 메소드를 호출하는 변수 객체입니다. lookupvalue (this); }} // 비 터미네이터 표현식 역할 클래스 추가 확장 {개인 표현식 왼쪽, 오른쪽; 공개 주소 (표현식 왼쪽, 표현 오른쪽) {this.left = 왼쪽; 이것은 오른쪽 = 오른쪽; } public int 해석 (Context Con) {return left.interpret (con) + right.interpret (con); }} 클래스 빼기 표현식 {개인 표현식 왼쪽, 오른쪽; public suxcract (표현식 왼쪽, 표현 오른쪽) {this.left = 왼쪽; 이것은 오른쪽 = 오른쪽; } public int 해석 (Context Con) {return left.interpret (con) - 오른쪽. 인터넷 (con); }} class 곱하기 표현식 {개인 표현식 왼쪽, 오른쪽; 공개 곱하기 (표현식 왼쪽, 표현 오른쪽) {this.left = 왼쪽; 이것은 오른쪽 = 오른쪽; } public int 해석 (Context Con) {return left.interpret (con) * right.interpret (con); }} Class Division은 표현식을 확장합니다 {개인 표현식 왼쪽, 오른쪽; 공공 사단 (표현식 왼쪽, 표현 오른쪽) {this.left = 왼쪽; 이것은 오른쪽 = 오른쪽; } public int 해석 (Context Con) {try {return. interpret (con) / right.interpret (con); } catch (arithmeticexception ae) {system.out.println ( "divorc is 0!"); 반환 -11111; }}} // 프로그램 테스트, 계산 (a*b)/(a-b+2) 공개 클래스 테스트 {개인 정적 표현 Ex; 개인 정적 컨텍스트 사기; public static void main (String [] args) {con = new Context (); // 변수 및 상수 설정 변수 a = 새 변수 (); 변수 b = 새로운 변수 (); 상수 C = 새로운 상수 (2); // 변수 con.addValue (a, 5)를 할당합니다. con.addvalue (b, 7); // 작동, 우리는 문장의 구조를 분석하고, 구성 Ex = New Division (New Multiply (A, B), New Add (New Suptract (A, B), C); System.out.println ( "작동 결과는 다음과 같습니다. }} 통역 모드의 장점과 단점
통역사는 간단한 구문 분석 도구입니다. 가장 중요한 장점은 확장 성입니다. 구문 규칙을 수정하려면 해당 비 터미널 문자를 수정하면됩니다. 구문을 확장하면 비 터미널 문자 만 추가하면됩니다.
그러나 통역사 패턴은 클래스가 확장되며 각 구문은 비 말단 표현식을 생성해야합니다. 구문 규칙이 비교적 복잡한 경우 많은 클래스 파일이 생성 될 수있어 유지 관리에 많은 어려움이 있습니다. 동시에, 재귀 호출 방법이 채택되기 때문에, 각 비 말단 표현은 그 자체와 관련된 표현에만 관심이있다. 각 표현식은 최종 결과를 알아야하며 재귀 적이어야합니다. 객체 지향 언어이든 프로세스 지향 언어이든 재귀는 권장되지 않는 방법입니다. 많은 루프와 재귀를 사용하기 때문에 효율성은 무시할 수없는 문제입니다. 특히 구문 분석 복합, 긴 구문을 해석하는 데 익숙 할 때 효율성은 견딜 수 없습니다.
통역 모드에 대한 해당 시나리오
다음 경우 통역 모드를 사용할 수 있습니다.
SQL 문과 같은 간단한 구문 규칙이 있습니다. SQL 문을 기반으로 RM 변환을 수행 해야하는 경우 해석자 패턴을 사용하여 문을 해석 할 수 있습니다.
첨가, 뺄셈, 곱셈 및 분할의 네 가지 작업과 같은 일부 반복적 인 문제이지만 공식은 매번 다릅니다. 때로는 A+BC*D이며 때로는*B+CD 등입니다. 공식은 끊임없이 변화하고 있지만, 모두 추가, 빼기, 곱셈 및 분할의 4 가지 비 터미널 문자로 연결됩니다. 현재 통역사 모드를 사용할 수 있습니다.
주목해야 할 것
인터프리터 모드는 실제로는 비교적 드물게 사용되지 않는 모드입니다. 비 터미널 통역사들이 문법의 규칙에 미리 익숙하지 않거나 문법이 특히 간단하다면 논리를 이해하기가 어렵다고 상상해보십시오. 인터프리터 모드는 효율성, 성능 및 유지 보수와 같은 문제를 일으킬 수 있기 때문에 실제 시스템 개발에는 거의 사용되지 않습니다.