2015. 3. 16.

flex and bison 컴파일 기초

flex 와 bison은 리눅스에서 아래의 명령어로 다운 가능하다.


sudo apt-get install flex bison


flex_bison_O'Reilly에 나온 첫번째와 두번째 예제를 해보겠다.
입력한 문장의 줄수, 단어수, 캐릭터 수를 카운트하는 예제를 만들어 보겠다.

fb1-1.l 이란 이름으로 예제를 만든다.
내용은 아래와 같다.



//선언부
%{
    int chars = 0;
    int words = 0;
    int lines = 0;
%}

%% 
//pattern
[^ \t\n\r\f\v]+ { words++; chars += strlen(yytext); } //yytext는 pattern이 match 된 input text를 가리키는 포인터다.
\n        { chars++; lines++; } 
.         { chars++; }

%%
//main
main(int argc, char **argv)
{
    yylex();  //flex가 scanner routine을 준다. token.
    printf("lines : %8d words: %8d chars : %8d\n", lines, words, chars);
}


선언부는 %{   ... %} 안에 넣어서 선언한다.

pattern은 아래 형식으로 작성한다.
pattern { ... }
pattern은 말그대로 matching 될 pattern이고 뒤에 { ... }은 pattern이 match된 경우 실행하는 부분이다.
+ 는 그것 혹은 그 이상의 것을 match할때 쓴다. 여기서는 단어나 string of letters를 의미하게 된다.
. 은 else 같은 기능으로 위에 제시된 pattern에 해당하지 않는 경우에 실행하도록 한다.

그 다음 컴파일을 해보자.


flex fb1-1.l       // flex에게 우리 프로그램을 해석하라고 시킨다.(이때는 에러를 말하지 않는다) 그러면 lex.yy.c 가 생성 된다.
cc lex.yy.c -lfl  // lex.yy.c를 flex library와 링크하여 컴파일, c프로그램을 만든다. a.out이 생성 된다.
./a.out              // 실행한다.

문장 입력후 ctrl-D를 해보자.
아마 카운트 결과가 멋지게 나올 것이다!









fb1-2.l 이란 이름으로 예제를 만든다.
내용은 아래와 같다.


/* English -> American*/
%%
"colour" {printf("color");}
"flavour" {printf("flavor");}

. {printf("%s",yytext);}
%%

실행 결과는.... 영국식 단어로 입력하면 미국식 단어로 출력된다!


엇? 그런데 선언부와 main이 없는데 괜찮나?!

괜찮다.

flex가 기본 form을 제공한다.




출처 :
flex_bison_O'Reilly

댓글 없음: