코드/GOF
디자인 패턴 - 행위(Behavioral) 패턴 (1) 해석자 패턴(Interpreter Pattern)
미로처럼
2024. 3. 18. 09:50
728x90
문법 규칙을 클래스화 한 구조로, 일련의 규칙으로 정의된 문법적 언어를 해석하는 패턴
인터프리터 패턴은 간단한 언어에 대한 문법을 정의하고, 언어로 문장을 표현하고, 이러한 문장을 해석하는 방법을 설명하며,
간단한 언어를 구현하고, 그 문장을 해석하는 방법을 구현합니다.
언어를 정의하기 위해서 규칙을 명백히 표현해야하기 때문에 표기법을 사용합니다.
가장 유명하게 베커스-나우르 표기법(Backus-Naur form, BNF)입니다.
베커스-나우르 표기법 (문맥 자유 문법)
BNF 표기법은 문법을 수학적인 수식으로 표기할 때 많이 이용.
입력된 언어의 문장을 해석하기 위해 먼저 아래와 같이 정의
::= 정의
|선택(단일)
<> Non-Terminal 기호(재정의대상)
<기호> ::= <표현식>
기호는 말단 기호가 될 수 없고, 표현식은 다른 기호의 조합, 또는 여러 가지의 표현식 중 하나를 사용한다는
의미로 |를 사용한다. 다른 표현식으로 정의되지 않은 기호는 자동적으로 말단 기호가 된다.
또한, 기호가 아닌 상수에는 따옴표를 붙여서 구별한다.
terminalExpression
digt을 확인해보면 0부터 9까지의 숫자 중 하나로 치환될 수 있다는 표시로 표현 가능
digt 은 더 이상 다른 문자로 치환될 수 없는는 종점의 문자인데 이러한 문자는 termial expression이라 한다.
non-termialExpression
number의 경우 nubmer 와 digt 로 표현 가능 이렇게 아직 치환 될 문자가 남은
경우를 Nonterminal expression이라 한다.
https://ko.wikipedia.org/wiki/%EB%B0%B0%EC%BB%A4%EC%8A%A4-%EB%82%98%EC%9A%B0%EB%A5%B4_%ED%91%9C%EA%B8%B0%EB%B2%95
구조
AbstractExpression
추상 syntax tree의 모든 노드에 공통으로 적용될 추상 interpret() 메서드를 선언
- terminal expression
- 문법의 terminal 심볼마다 인스턴스가 필요.
- 표기가 더이상 문자 또는 숫자로 치환되지 않는 기호
- NonTerminal Expresion
- 문법상의 모든 규칙 R::=R1R2…RnR::=R1R2…RnR::=R_1R_2…R_n 에 필요
- R1에서 Rn 까지의 각 기호들에 대해 AbstractExpression 유형의 인스턴스 변수를 유지
- 문법의 non- terminal 기호에 대한 해석 연산 구현( R1-R2 까지 나타내는 변수에 대해 재귀적으로 자신을 호출)
- 식별자와 같이 종료되지 않은 기호이고, 해석을 위해 전개되는 표현이며 기호나 규칙에 대한 노드만 가진 트리를 말한다.
- 반복적인 기호를 사용할 경우 플라이웨이트 패턴을 이용해 공유할 수 있다.
- Context
- 해석 프로그램에 대한 전반적인 정보가 포함.
- Client
- 문법이 정의하는 언어의 특정 문장을 나타내는 추상 구문 트리를 만듬. 추상 구문 트리는 NonTerminalExpression 및 TerminalExpression 클래스의 인스턴스에서 결합
- 해석 연산을 호출 non-terminal 클래스와 terminal 클래스의 객체로 구성되고 구성 객체의 interpret()를 호출
728x90