TR069

파서(Parser)

불량껌 2009. 3. 26. 17:14

파서는 "구문 분석기" 라 합니다. 즉, 구문을 의미별로 어떠한 처리를 한다는 것이죠.

이거를 바로 쓸 수는 없고, 어휘 분석기 라는 것도 씁니다. 이를 렉서라 합니다.

즉,

렉서에서 나온 결과를 파서에서 사용하는 겁니다.

예를 들어, 사용자가 go up left 라는 말을 입력한다면

이를 해석하기 위해 일단 렉서에서는

go

up

left

이렇게 세 개의 단어로 끊습니다.

만약 이 단어에 대응되는 대표값이 있다면 이걸로 치환해서 넘겨주고 아니라면 문자열 그대로 넘겨줍니다. 위의 go up left 같은 경우 이를 의미있는 걸로 봐서 대표값을 설정해 주었다고 한다면, TK_GO, TK_UP, TK_LEFT 등으로 넘어오게 될겁니다.


그럼 이걸 이제 파서에서는 처리합니다.

GO_STATEMENT := TK_GO [TK_UP|TK_DOWN|TK_LEFT|TK_RIGHT]*

이런식의 BNF로 문법을 만들었다고 하면,

GO_STATEMENT(하나의 의미로 묶어놓은 단위) 는 go left 또는 go left left left left... 또는.. 이런식으로 go 이후 뒤에 left, right, up, down 등등이 무한정 올 수 있는 그러한 구문이 됩니다.

이를 사용자가 지정한 구조체 안에 넣습니다. 예를 들면, 이러한 구조입니다.


enum T_DIRECTION

{

   T_LEFT = 0,

   T_RIGHT,

   T_UP,

   T_DOWN

};


typedef struct direction

{

     T_DIRECTION direction;

     struct direction* next;

} direction;


typedef struct gostmt

{

   int directionCnt;

   direction* direction;

} gostmt;


따라서, 사용자가 go up left라고 입력했다면,


struct gostmt안의 변수들의 값은

directionCnt = 2가 되고,

direction은 T_UP, next를 따라가보면 direction은 T_LEFT 가 되고, 그 다음 next는 NULL이 되겠죠.

이렇게 사용자가 입력한 값을 프로그램에서 의미적으로 구분하고 이에 대응되는 구조로 데이터를 넘겨받고 싶을 때 이 "파서" 라는 것을 이용하는 겁니다.