관리 메뉴

HAMA 블로그

Interpreter 패턴 본문

디자인패턴

Interpreter 패턴

[하마] 이승현 (wowlsh93@gmail.com) 2015. 5. 6. 22:05


GOF 의 디자인패턴중 하나인 인터프리터 패턴에 대해서 살펴보도록 하자. 


인터프리터 패턴은 모든 종류의 GoF 패턴들 중에 가장 어렵다. 물론 인터프리터 자체를 만드는게 어렵


기때문에 덩달아  어렵다는 이야기이고, 모습 자체는 여느 디자인패턴과 비슷하다. 


원래  디자인패턴이라는건 사실 모양은 다 비슷비슷하다.  그게 쓰여지는 의도에 따라서 패턴의 구분이 


이루어진다. 인터프리터 패턴은 느낌 그대로  어떤 해석기, 즉 "간이언어" 를 만들기 위한 패턴이다.  


예를들어 클라이언트-서버 프로그램을 만들때 ,  프로토콜로 "사람이 자연스럽게 읽을수 있는  문법형태"

  

로 하자!! 라고 정할수있는데, 그때 사용하면  되겠다.  프로토콜 예로는 "Select  * From  Table"  이렇게~



자 이 글에서는 


"program repeat 3 go right end  end"  라는 문장을 해석해서 실행하는 프로그램을 예로 들어 설명해보겠다. 


"자바언어로 배우는 디자인 패턴 입문" 이라는 책을 참고했다. 



일단 저 문장에 대해서 BNF 라고 하는 언어의 문법을 표기할때 사용되는 표기법으로 분석해보자.


<program> ::= program <command list>

<command list> ::= <command>* end

<command> ::= <repeat command> | <primitive command>

<repeat command> ::= repeat <number> <command list>

<primitive command>::= go | right | left 


사실 저 BNF 를 만드는게 가장 어렵다고 볼수있다.


만약 SQL 을 저런식으로 만든다고 상상해보자.


statement  ::= INSERT INTO INDENTIFIER [LP idList RP] VALUES LP exprList RP 

| CREATE DATABASE IDENTIFIER

| CREATE TABLE IDENTIFIER LP declarations RP

| DROP TABLE IDENTIFIER

| BEGIN | WORK | TRAN[SACTION]]

| COMMIT | WORK | TRAN[SACTION]]

| ROLLBACK [WORK | TRAN[SACTION]]

| DUMP

| USE DATABASE IDENTIFIER

| UPDATE IDENTIFIER SET IDENTIFIER EQUAL expr WHERE expr

| DELETE FROM IDENTIFIER WHERE expr

| SELECT [INTO identifier idList FROM idList [WHERE expr]


...

등등 무수히 많은 정의가 추가될것이다.



돌아가서 첫번째 BNF 를  토대로 클래스 다이어그램을 만들어보자. 






위 클래스 다이어그램에 


"program repeat 3 go right end  end" 를 파싱해서 객체트리를 만들어보자. 이 객체트리를 구문트리


라고 한다. 객체트리를 만드는 방법은 문장을 토큰화하여  한 단어씩 분석하면서 진행된다.  처음에 


program 객체를 만들고,  해당 객체가  가지고 있을수있는 CommandListNode 객체를  만들고


CommandListNode 는  CommandNode 객체(들)를 만들고 (이때 Repeat / Primitive 선택) 이런식으로~


Primitive 는 go 라는 명령어를 가지고있게되고,나중에 순회하면서 go 에 해당하는 행동을 하게함.





만들어진 구문 트리 시작 객체의 Execute 함수를 실행하면  구문트리를 순회하게 된다. 


자동차를 저 문장을 가지고 실행하게된다면  앞으로(go) 갔다가 오른쪽(right)으로 도는 행동을 


3번 연속하게된다. 만약 SQL 문으로 저런 구문트리를 만들었다고 가정하면 , 2차배열의 테이블을 


구문트리 객체에 파라미터로  넘기면 , 구문트리를 돌면서 해당 객체의 수행방법에 따라서


해당 테이블에서 특정  데이터만 뽑아낼수있을것이다.

Comments