코드/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