블로깅의 목적이 타인에게 지식을 공유하기 보다는 내 스스로의 지식 저장소로 쓰기 위한 목적이 더 크므로 방문자를 위한 배려가 고려되지 않았다.
그래서 lex가 어떻게 생겨났고 어떻게 쓰이며 어떻게 설치하고 그런 부분은 과감히 생략한다.
아마도 대부분의 linux라면 설치가 되어있으리라 생각한다. 여튼...내가 사용하는 회사 서버에는 설치가 되어있다.

인터넷에서 검색해서 나온대로 컴파일 방법은 아래와 같다

lex [OPTIONS] [FILE]...

머...옵션은 무쟈게 많다. 기껏 버전은 2.5.35인데 머가 이리 많은지...
그리고 버전과 해당 옵션 설명을 대충이라도 보기위해 매뉴얼을 펼쳐본 순간...내 시스템에서 lex는 flex라는 걸 알게되었다;;;

$ ls -al `which lex`
lrwxrwxrwx. 1 root root 4 2012-03-27 05:33 /usr/bin/lex -> flex*

이게 머야...그럼 지금 난 lex를 하고 있는건가 flex를 하고 있는건가...처음부터 혼돈의 카오스가 밀려오는구나...

각설하고 이전 포스팅에서 사용했던 간단한 예제를 컴파일 해보자.

%%
.|\n ECHO;
%%

main()
{
    yylex();
}

위 예제는 입력을 그대로 화면에 출력해 주는 예제이다. 기본적으로 입력받은 그대로 echo 해주는 것 같음.
그리고 글을 쓰고 있는 지금도 yylex();가 무엇을 의미하는지 모르겠다.
모르겠다고 해놓고 지나가려다 보니 궁금해서 한번 뒤져봤더니 아래와 같단다.

// Call yylex with new input/output sources.
int yylex( FLEX_STD istream* new_in, FLEX_STD ostream* new_out = 0 )
    {
    switch_streams( new_in, new_out );
    return yylex();
    }

// Switch to new input/output streams.  A nil stream pointer
// indicates "keep the current one".
virtual void switch_streams( FLEX_STD istream* new_in = 0,
                FLEX_STD ostream* new_out = 0 ) = 0;

이번에는 간단한 파싱이 들어간 예제이다

%{
        /*
         * My favorite...
         */
%}
%%
[\t ]+  ;
rain |
rose            { printf("%s!! That is my favorite.\n", yytext); }
love |
story           { printf("%s!! I like a love story. ^_~\n", yytext); }
"potato chip" |
potato |
chip  { printf("%s...!! now and then, I have a potato chip.\n", yytext); }
 
[A-Za-z]+ { printf("%s..., what is that?\n", yytext); }
 
.|\n    { ECHO; }
 
%%
main()
{
        yylex();
}

rain, rose, love, story, ptato chip, potato, chip에 대한 패턴 처리가 들어있다. lex에서도 | 문자는 or와 같은 의미로 쓰이나보다.
7번 라인의 구문은 먼지 모르겠다;;

[\t ]+  ;

 

'개발관련 > (Fast)Lex' 카테고리의 다른 글

Yacc, Bison으로 인한 문제  (0) 2013.10.25
lex 간단한 예제2  (0) 2013.10.25
시작하기에 앞서...  (0) 2013.10.24
확장자 규칙의 사용  (0) 2013.10.24
lex를 위한 간단한 Makefile  (0) 2013.10.24