23 디자인 모드 15 장 : Java 통역 모드
정의 : 언어가 주어지고 문법의 표현을 정의하고 표현을 사용하여 언어의 문장을 해석하는 통역사를 정의하십시오.
유형 : 행동 패턴
클래스 다이어그램 :
인터프리터 모드는 비교적 드물게 사용되는 모드이며 이전에는이 모드를 사용한 적이 없습니다. 통역사 모드를 살펴 보겠습니다.
통역 모드의 구조
초록 통역사 : 모든 콘크리트 표현이 구현 될 초록 인터페이스 (또는 추상 클래스)를 선언합니다. 인터페이스는 주로 설명 작업이라고하는 해석 () 메소드입니다. 특정 해석 작업은 다양한 구현 클래스에 의해 완료되며, 특정 통역사는 각각 터미네이터 통역 인 TerminalExpression 및 비 터미널 통역사 비 말단 신 발현에 의해 완료됩니다.
터미네이터 표현식 : 문법의 요소와 관련된 해석 작업을 구현합니다. 일반적으로 통역사 패턴에는 하나의 터미네이터 표현식이 있지만 다른 터미네이터에 해당하는 여러 인스턴스가 있습니다. 터미네이터의 절반은 문법의 작동 장치입니다. 예를 들어, R1과 R2가 종말기이고, R1 및 R2를 구문 분석하는 해당 통역사는 터미네이터 인 간단한 공식 r = r1+r2가 있습니다.
비 말단 발현 : 문법의 각 규칙은 비 말단 발현에 해당합니다. 비 터미널 표현은 일반적으로 문법의 운영자 또는 기타 키워드입니다. 예를 들어, 공식 r = r1 + r2에서 +는 비 말단 문자이며, 구문 분석 +의 통역사는 비 말단 문자입니다. 비 말단 표현은 논리의 복잡성에 따라 증가하고 원칙적으로 각 문법 규칙은 비 말단 발현에 해당합니다.
환경 역할 :이 역할의 과제는 일반적으로 r = r1+r2와 같은 문법에 각 종말기에 해당하는 특정 값을 저장하는 데 사용됩니다. 우리는 100을 R1, 200에서 R2로 할당합니다. 이 정보는 환경 역할에 저장해야합니다. 대부분의 경우, 우리는 환경 역할이 충분하기 때문에 MAP를 사용합니다.
코드 구현
클래스 컨텍스트 {} 추상 클래스 expression {public arbost 객체 인터프리터 (컨텍스트 CTX); } class terminalexpression extress {public Object Interpreter (context ctx) {return null; }} class nonterminalexpression은 표현식을 확장합니다 {public nonterminalexpression (expression ... expressions) {} public Object Interpreter (Context CTX) {return null; }} public class client {public static void main (String [] args) {String Expression = ""; char [] chararray = expression.tochararray (); 컨텍스트 ctx = 새로운 컨텍스트 (); 스택 <표현> 스택 = 새 스택 <표현> (); for (int i = 0; i <chararray.length; i ++) {// 구문 판단을하고 재귀 적으로 호출} 표현식 exp = stack.pop (); Exp. Interpreter (CTX); }}문법 재귀의 코드 부분은 특정 상황에 따라 구현되어야하므로 코드에 반영되지 않습니다. 초록 표현식은 문법 컬렉션을 생성하는 열쇠입니다. 각각의 비 말단 발현은 최소 구문 단위를 해석 한 다음 이러한 구문 장치를 완전한 문법으로 재귀 적으로 결합합니다. 이것은 통역사 패턴입니다.
통역 모드의 장점과 단점
통역사는 간단한 구문 분석 도구입니다. 가장 중요한 장점은 확장 성입니다. 구문 규칙을 수정하려면 해당 비 터미널 문자를 수정하면됩니다. 구문을 확장하면 비 터미널 문자 만 추가하면됩니다.
그러나 통역사 패턴은 클래스가 확장되며 각 구문은 비 말단 표현식을 생성해야합니다. 구문 규칙이 비교적 복잡한 경우 많은 클래스 파일이 생성 될 수있어 유지 관리에 많은 어려움이 있습니다. 동시에, 재귀 호출 방법이 채택되기 때문에, 각 비 말단 표현은 그 자체와 관련된 표현에만 관심이있다. 각 표현식은 최종 결과를 알아야하며 재귀 적이어야합니다. 객체 지향 언어이든 프로세스 지향 언어이든 재귀는 권장되지 않는 방법입니다. 많은 루프와 재귀를 사용하기 때문에 효율성은 무시할 수없는 문제입니다. 특히 구문 분석 복합, 긴 구문을 해석하는 데 익숙 할 때 효율성은 견딜 수 없습니다.
통역 모드에 대한 해당 시나리오
다음 경우 통역 모드를 사용할 수 있습니다.
SQL 문과 같은 간단한 구문 규칙이 있습니다. SQL 문을 기반으로 RM 변환을 수행 해야하는 경우 해석자 패턴을 사용하여 문을 해석 할 수 있습니다.
첨가, 뺄셈, 곱셈 및 분할의 네 가지 작업과 같은 일부 반복적 인 문제이지만 공식은 매번 다릅니다. 때로는 A+BC*D이며 때로는*B+CD 등입니다. 공식은 끊임없이 변화하고 있지만, 모두 추가, 빼기, 곱셈 및 분할의 4 가지 비 터미널 문자로 연결됩니다. 현재 통역사 모드를 사용할 수 있습니다.
주목해야 할 것
인터프리터 모드는 실제로는 비교적 드물게 사용되지 않는 모드입니다. 비 터미널 통역사들이 문법의 규칙에 미리 익숙하지 않거나 문법이 특히 간단하다면 논리를 이해하기가 어렵다고 상상해보십시오. 인터프리터 모드는 효율성, 성능 및 유지 보수와 같은 문제를 일으킬 수 있기 때문에 실제 시스템 개발에는 거의 사용되지 않습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.