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 [실행파일 이름]
./[실행 파일]
반응형
'프로그래밍 > Compiler' 카테고리의 다른 글
[컴파일러] 3-1. 구문분석기 구조 (0) | 2024.04.06 |
---|---|
[컴파일러] 2.4. 유한 오토마타 (0) | 2024.02.26 |
[컴파일러] 2.3. 토큰의 인식 (0) | 2024.02.24 |
[컴파일러] 2.2. 토큰의 명세 (0) | 2024.02.20 |
[컴파일러] 2-1. 어휘 분석 역할 (0) | 2024.02.17 |
댓글