프로그래밍/Compiler

[컴파일러] 2.5. Flex 사용하기

Beginner:) 2024. 3. 1.
320x100

이전 단계에서 어휘 분석(토큰, 오토마타, 어휘분석 이론)에 대해 얘기를 하였는데

 

어휘분석기를 생성하는 스캐닝 도구(openSource) Flex를 사용해보자.

 

Flex는 특정 패턴을 정의하면, 각 패턴에 해당하는 토큰을 생성해준다. 

 

이후 Flex를 통한 결과물로 구문 분석, 언어 처리를 할 수 있다.

 


Flex 구문

%option // flex문법의 옵션을 설정하는 부분

%{
	/* Flex에 필요한 라이브러리, C코드 등을 정의 */
%}

/* (정규식)규칙 정의 */

%%
	/* 매칭된 패턴이 있을 경우 C코드를 정의 */
%%

 

Flex의 특수 변수& 함수

yytext - 매칭된 패턴의 문자열

yyleng - yytext의 길이

yylval - 토큰의 값을 반환

yylex() - 매칭된 패턴의 토큰을 반환

 

Flex 구문 사용 예제

Flex 파일의 확장자는 ".l"이다.

/* my_flex.l */
%option noyywrap
%option never-interactive

%{
#include <stdio.h>

#define LT      1
#define LE      2
#define EQ      3
#define NE      4
#define GT      5
#define GE      6
#define RELOP   7
#define IF      8
#define THEN    9
#define ELSE    10
#define ID      11
#define NUMBER  12

int yylval;
%}

delim     [ \t\n]
ws        {delim}*
letter    [A-Za-z]
digit     [0-9]
id        {letter}({letter}|{digit})*
number    {digit}+(\.{digit}+)?(E[+-]?{digit}+)?

%%
{ws}      {/* no action and no return */}
if        {return(IF);}
then      {return(THEN);}
else      {return(ELSE);}
{id}      {yylval = ID; return(ID);}
{number}  {yylval = NUMBER; return(NUMBER);}
"<"       {yylval = LT; return(RELOP);}
"<="      {yylval = LE; return(RELOP);}
"="       {yylval = EQ; return(RELOP);}
"<>"      {yylval = NE; return(RELOP);}
">"       {yylval = GT; return(RELOP);}
">="      {yylval = GE; return(RELOP);}
%%

int main(int argc, char** argv) {
    yy_scan_string("if then else variable123 53 >= ==");

    int result = yylex();
    while (result) {
        switch(result) {
            case IF: printf("IF: %s \n", yytext); break;
            case THEN: printf("THEN: %s \n", yytext); break;
            case ELSE: printf("ELSE: %s \n", yytext); break;
            case ID: printf("ID: %s \n", yytext); break;
            case NUMBER: printf("NUMBER: %s \n", yytext); break;
            case RELOP: printf("RELOP: %s \n", yytext); break;
        }
        result = yylex();
    }
}

 

Flex 설치

Ubuntu20.04 기준이다.

sudo apt-get install flex

 

Flex 사용 예제

VSCode에서 사용되었으며 vim과 같은 텍스트 편집기로 하여도 상관없다.

flex 명령어를 수행시 lex.yy.c코드가 생성되는데, 1800줄 정도하여 첨부하진 않는다.

 

flex [flex 파일명]
gcc lex.yy.c -o [실행파일 이름]
./[실행 파일]

반응형

댓글