디자인 모드 - 해석 기

4945 단어 디자인 모드
INTERFRETER 해석 기
1. 의도
언어 를 지정 하고 문법 을 정의 하 는 표현 을 정의 하 며 해석 기 를 정의 합 니 다. 이 해석 기 는 이 표현 을 사용 하여 언어 중의 문장 을 설명 합 니 다.
2. 적용 성
하나의 언어 가 실행 을 설명 하고 이 언어의 문장 을 추상 적 인 문법 트 리 로 표시 할 때 해석 기 모드 를 사용 할 수 있 습 니 다.다음 과 같은 상황 이 존재 할 때 이 모델 의 효과 가 가장 좋다.
4. 567917. 이 문법 은 복잡 한 문법 에 대해 간단 하고 문법 의 유형 차원 이 커 져 관리 할 수 없다.이때 문법 분석 프로그램 생 성기 와 같은 도구 가 가장 좋 은 선택 이다.추상 적 인 문법 트 리 를 구축 하지 않 아 도 표현 식 을 설명 할 수 있 습 니 다. 그러면 공간 을 절약 할 수 있 고 시간 도 절약 할 수 있 습 니 다
4. 567917. 효율 은 관건 적 인 문제 의 가장 효율 적 인 해석 기 가 아니 라 문법 분석 나 무 를 직접 해석 하여 이 루어 진 것 이 아니 라 먼저 다른 형식 으로 전환 하 는 것 이다
3. 구조
4. 참여 자
추상 식 (추상 식)
- 추상 적 인 해석 작업 을 설명 합 니 다. 이 인 터 페 이 스 는 추상 적 인 문법 트 리 의 모든 노드 에 공 유 됩 니 다.
TerminalExpression (종결 문자 식)
- 문법 에서 의 종결 부호 와 관련 된 해석 작업 을 실현 합 니 다.
- 한 문장의 모든 종결 부 호 는 이러한 인 스 턴 스 가 필요 합 니 다.
Nonterminal Expression (비 종결 문자 식)
- 문법 중의 모든 규칙 에 대해 R: = Nonterminal Expression 이 필요 합 니 다.
- 모든 기호 에서 AbstractExpression 형식의 인 스 턴 스 변 수 를 유지 하기 위해 서 입 니 다.
- 문법 중의 비 종결 부 호 를 위해 해석 작업 을 실현 합 니 다.일반적으로 표 시 된 대상 들 의 해석 작업 을 재 귀적 으로 호출 해 야 한다.
컨 텍스트 (상하 문)
- 해석 기 이외 의 전역 정 보 를 포함 합 니 다.
클 라 이언 트 (클 라 이언 트)
- 이 문법 이 정 의 된 언어 에서 특정한 문장 을 나타 내 는 추상 적 인 문법 트 리 를 구축 합 니 다.이 추상 트 리 문법 은 Nonterminal Expression 과 Terminal Expression 의 인 스 턴 스 로 구성 되 어 있다.
- 호출 해석 작업.
5. 협력
l  Client 는 Nonterminal Expression 과 Terminal Expression 의 인 스 턴 스 를 위 한 추상 적 인 문법 트 리 를 구축 하고 컨 텍스트 를 초기 화하 고 해석 작업 을 호출 합 니 다.
l  모든 비 종결 문자 표현 식 노드 는 해당 하위 표현 식 의 해석 동작 을 정의 합 니 다.각 종결 부 표현 식 의 해석 작업 은 귀속 의 기 초 를 구성한다.
l  각 노드 의 해석 작업 은 상하 문 으로 해석 기의 상 태 를 저장 하고 접근 합 니 다.
6. 효과
해석 기 모드 는 다음 과 같은 장점 과 부족 함 이 있 습 니 다.
1)  문법 을 바 꾸 고 확장 하기 쉽다.이 모델 은 문법 규칙 을 나타 내 는 클래스 를 사용 하기 때문에 계승 을 통 해 문법 을 바 꾸 거나 확장 할 수 있 습 니 다.기 존 표현 식 은 증분 식 으로 바 꿀 수 있 으 며, 새로운 표현 식 은 구 표현 식 의 변형 으로 정의 할 수 있 습 니 다.
2)  문법 을 실현 하기 도 쉽다.추상 문법 트 리 의 각 노드 의 클래스 를 정의 하 는 것 은 대체적으로 유사 하 다.이러한 종 류 는 직접 작성 하기 쉬 우 며, 일반적으로 컴 파일 러 나 문법 분석 프로그램 생 성기 로 자동 으로 생 성 할 수 있다.
3)  복잡 한 문법 은 유지 하기 어렵다.해석 기 모드 는 문법 중의 모든 규칙 에 최소한 하나의 종 류 를 정의 합 니 다.따라서 많은 규칙 을 포함 하 는 문법 은 관리 하고 유지 하기 어 려 울 수 있다.다른 디자인 모델 을 응용 하여 이 문 제 를 완화 시 킬 수 있다.
4)  새로운 해석 식 방식 추가;해석 기 모드 는 새로운 표현 식 '계산' 을 쉽게 만 듭 니 다.
7. 실현
1)  추상 구문 트 리 만 들 기;해석 기 모드 는 추상 적 인 문법 트 리 를 만 드 는 방법 을 설명 하지 않 았 다.다시 말 하면 그것 은 문법 분석 과 관련 이 없다.추상 문법 트 리 는 표 로 구동 되 는 문법 분석 프로그램 으로 생 성 될 수 있 고 손 으로 쓴 문법 분석 프로그램 으로 생 성 되 거나 Client 에서 직접 제공 할 수 있 습 니 다.
2)  정의 해석 작업;표현 식 클래스 에서 설명 작업 을 정의 해 야 하 는 것 은 아 닙 니 다.항상 새로운 해석 기 를 만 들 려 면 Visitor 모드 를 사용 하여 설명 을 독립 된 '질문 자' 대상 에 넣 는 것 이 좋 습 니 다.
3)  Flyweight 모드 와 끝 문자 공유 하기;일부 문법 에서 한 문장 에 같은 종결 부가 여러 번 나타 날 수 있다.이때 그 기호의 단일 복사 본 을 공유 하 는 것 이 가장 좋다.
종결 노드 는 추상 적 인 문법 트 리 에 있 는 위치 에 대한 정 보 를 저장 하지 않 습 니 다.설명 과정 에서 필요 한 문맥 정 보 는 모두 부모 노드 에서 전달 된다.따라서 공 유 된 (내부 의) 상태 와 들 어 오 는 (외부) 상태 가 명확 하 게 구분 되 어 Flyweight 모드 를 사용 했다.
8. 코드 예제
AbstractExpression
package com.examples.pattern.interpreter;

/**
 *      
 */
public abstract class AbstractExpression {

	public abstract void interpret(Context ctx);

}

TerminalExpression
package com.examples.pattern.interpreter;

/**
 *       
 */
public class TerminalExpression extends AbstractExpression {

	@Override
	public void interpret(Context ctx) {
		System.out.println("this is terminalexpression");

	}

}

NonterminalExpression
package com.examples.pattern.interpreter;

/**
 *        
 */
public class NonterminalExpression extends AbstractExpression {

	@Override
	public void interpret(Context ctx) {
		System.out.println("this is nonterminalexpression");
	}

}

Context
package com.examples.pattern.interpreter;

import java.util.ArrayList;
import java.util.List;

/**
 *    
 */
public class Context {

	private String content;

	private List list = new ArrayList();

	public void setContent(String content) {
		this.content = content;
	}

	public String getContent() {
		return this.content;
	}

	public void add(AbstractExpression eps) {
		list.add(eps);
	}

	public List getList() {
		return list;
	}

}

Client
package com.examples.pattern.interpreter;

import java.util.Iterator;
import java.util.List;

public class Client {

	public static void main(String[] args) {

		Context ctx = new Context();
		ctx.add(new TerminalExpression());
		ctx.add(new NonterminalExpression());
		ctx.add(new TerminalExpression());
		List list = ctx.getList();
		Iterator it = list.iterator();
		while (it.hasNext()) {
			AbstractExpression ae = (AbstractExpression) it.next();
			ae.interpret(ctx);
		}

	}
}

9. 관련 모델 
Composite 모드: 추상 문법 트 리 는 복합 모드 의 인 스 턴 스 입 니 다.
Flyweight 모드: 추상 문법 트 리 에서 종결 부 를 공유 하 는 방법 을 설명 합 니 다.
Iterator: 해석 기 는 교체 기 를 사용 하여 이 구 조 를 옮 겨 다 닐 수 있 습 니 다.
Visitor: 추상 문법 트 리 의 각 노드 를 하나의 클래스 에서 유지 하 는 데 사용 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기