C++공부/GoF의 디자인 패턴

해석자(Interpreter)

아헿헿헿 2022. 6. 1. 13:08

1. 용도

어떤 언어에 대해, 그 언어의 문법에 대한 표현을 정의하면서 표현을 사용하여 해당 언어로 기술된 문장을 해석하는 해석자를 함께 정의합니다.


2.  활용성

해석이 필요한 언어가 존재하거나 추상 구문 트리로서 그 언어의 문장을 표현하고자할 때 해석자 패턴을 사용합니다. 해석자 패턴이 가장 적절할 때를 설명하면 다음과 같습니다.

  • 정의할 언어의 문법이 간단한 경우. 문법이 복잡하다면 문법을 정의하는 클래스 계통이 복잡해지고 관리가 불가능합니다.
  • 효율성은 고려 안하는 경우.

3. Class Diagram과 구조

[AbstractExpression] - 추상 구문 트리에 속한 모든 노드에 해당하는 클래스들이 공통으로 가져야 할 interpret 연산을 추상 연산으로 정의

[TerminalExpression] - 문법에 정의한 터미널 기호와 관련된 해석 방법 구현

[NonterminalExpression] - 문법의 오른편에 나타나는 모든 기호에 대해서 클래스를 정의

[Context] - 번역기에 대한 포괄적인 정보를 포함합니다

[Client] - 언어로 정의한 특정 문장을 나타내는 추상 구문 트리입니다.

 

사용자는 NonterminalExpression과 TerminalExpression 객체들로 해당 문장에 대한 추상 구문 트리를 만듭니다. 그리고 사용자는 Interpret 연산을 호출하는데, 이때 해석에 필요한 문맥 정보를 초기화합니다. NonterminalExpression 노드는 또 다른 서브 표현식에 대한 Interpret 연산을 이용하여 자신의 Interpret 연산을 정의합니다. Interpret 연산을 재귀적으로 사용하여 기본적 처리를 담당합니다. 각 노드에 정의한 Interpret 연산은 해석자의 상태를 정의하거나 그것을 알기 위해서 문맥 정보를 이용합니다.


4. 장단점

장점

  • 문법의 변경과 확장이 쉬움 - 문법에 정의된 규칙을 클래스로 표현하였기에 상속을 통해 쉽게 확장 및 변경 가능합니다.
  • 문법의 구현 용이- 추상 구문 트리의 노드의 클래스들은 비슷한 구현 방법을 갖습니다.
  • 표현식을 해석하는 새로운 방법 추가 가능 - 새로운 연산의 정의로 새로운 방식으로 정의된 표현식을 쉽게 해석할 수 있게 해줍니다.

단점

  • 복잡한 문법 관리 어려움 - 문법에 정의된 각 규칠별로 적어도 하나의 클래스를 정의해야합니다.

5. 구현 방법

  1. 추상 구문 트리 생성 - 해석자 패턴은 추상 구문 트리 생성 및 파싱 과정에 대해서는 다루지 않습니다.
  2. Interpret 연산 정의 - 표현식에 해당하는 클래스에서는 정의할 필요 없습니다.
  3. 플라이급 패턴을 적용하여 단말 기호 공유 - 단말 기호가 여러번 나타나는 문장은 그 기호에 대한 객체를 공유하는 것이 바람직합니다.