블로깅의 목적이 타인에게 지식을 공유하기 보다는 내 스스로의 지식 저장소로 쓰기 위한 목적이 더 크므로 방문자를 위한 배려가 고려되지 않았다.
그래서 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

회사 내에서 프로젝트를 진행하며 SQL Parser(이하 파서)가 필요했다.
물론 회사에서 개발을 이제 막 시작한 내게 제대로 된 파서를 기대하진 않을테지만, 아마도 최소한 회사는 내가 파서를 공부하면서 관련 정보를 얻고 지식을 습득하기는 바랄것이다.

무작정 정보의 바다에서 SQL 파서에 관한 정보를 얻다보니 가장 처음 Lex&Yacc를 알게 되었다.
그리고 Plex&Bison에 대해서도...또, Lemon에 대해서도 알게 되었다.
Lex를 보다 보니 Plex가 더 좋다는 글이 눈에 띄고 또 Lemon의 장점을 기술해 놓은 자료를 보면 첨부터 Lemon으로 공부해야하나 싶었지만...
결국 지금 난 Lex를 보고 있다.(이머병....)

처음엔 블로그에 Lex를 따로 구분하지 않고 기타나 개발관련으로 포스팅 하려 했는데 지금...거창하게도 따로 분류하여 포스팅을 하려 한다.
얼마나 갈지는 모르겠지만...
후에도 이 글이 남아있다면 어느정도 Lex를 알게 되고 블로그에 정보를 남긴 모습이리라...

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

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

이제 렉스를 공부하기 시작했는데...왠지 어느정도의 성취 없이 포기할 것도 같다.

여튼 시작이 반이랬다고 한발 내딛어 가장 가벼운 샘플을 따라해 보았다.

%%
.|\n ECHO;
%%

main()
{
    yylex();
}

 

쉽게 컴파일 하기 위해서 아래와 같이 Makefile 을 작성!

 

CC = gcc
LEX = lex 

test: test.c
        $(CC) -o $@ $< -ll

test.c: test.l
        $(LEX) -o $@ $<

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

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