IT/Tips

yacc and readline

싸후이 2009. 7. 9. 16:09

가장 대중적인 parser인 yacc parser(혹은 bison)는 자체적으로 yyparse() 함수를 호출하기 때문에 readline library 를 적용하기 힘들다. 이를 위해서는 yyparse()에 문자열을 건네주는 방법이 필요한데, yyparse는 보다시피 전달하는 인수가 없다.이 문제를 해결하기 위해  다음과 같이 하면 가능하다.


전체적인 코드 흐름은

 1) readline 라이브러리를 사용해서 buf에 문자열 입력

 2) buf의 문자를 yaccparser에 전달 (yy_scan_string 함수 사용)

 3) yyparse 실행

과 같이 된다.


1. 헤더파일 등을 추가





25     typedef struct yy_buffer_state *YY_BUFFER_STATE;

...

 42     #include <readline/readline.h>
 43     #include <readline/history.h>





2. XXX.y 파일에서 extern 부분에 다음을 추가한다.





 27     extern "C"
 28     {
 29         YY_BUFFER_STATE yy_scan_string(const char*);
 30         int yyparse(void);
 32         int yylex(void);
 33         void yyerror (const char *s);
 34     }




3. main 함수를 다음과 같이 수정한다.





384     while (stopParser == false) {
385         buf = readline(PROMPT);
386         if(buf[0]!='\0')
387             add_history(buf);
388         yy_scan_string(buf);

389         yyparse ();
390          free(buf);
392     }




컴파일시 -lreadline을 붙이는 것을 잊지 말자!


'IT > Tips' 카테고리의 다른 글

linux cd burnning  (0) 2009.07.17
linux shell shortcuts key  (0) 2009.07.13
bootsplash  (0) 2009.05.12
OS 설치후 추가 설치 프로그램  (1) 2009.04.28
리눅스 mp3 플레이어  (0) 2009.04.28