observe_db

[컴파일러] Lex 실습 본문

학교 공부/컴파일러(3-1)

[컴파일러] Lex 실습

쩡윤 2023. 4. 14. 16:43

4/14

 

일단 이친구가 예제이다.

%{
#define	IF	100
#define	ID	101
#define	RELOP	102
#define	LE	201
int yylval, tok;
%}
delim	[ \t\n]
ws	{delim}+
letter	[A-Za-z]
digit	[0-9]
id	{letter}({letter}|{digit})*
%%
{ws}	(/*do nothing */}
if	{yylval = 0; return(IF); }
{id}	{yylval = install_id(); return(ID); }
"<="	{yylval = LE; return(RELOP); }
%%
int install_id() {return(1);}
int yywrap() {return(0);}
main(){while(1){tok = yylex(); printf("%d %d\n", tok, yylval);}}

 

이 친구를 winflexbison이라는 프로그램을 통해 .c 파일로 변환하고, 그 파일을 빌드하여 .exe 실행파일을 만들어낸다.

 

 

그리고 여기에서

while, for, switch, case 토큰을 추가하고,

주석 처리하는 것이 오늘의 실습.

 

%{
#define	WHILE	103
#define	FOR	104
#define	SWITCH	105
#define	CASE	106
%}

%%

if	{yylval = 0; return(WHILE); }
for	{yylval = 0; return(FOR); }
switch	{yylval = 0; return(SWITCH); }
case	{yylval = 0; return(CASE); }

각각 이렇게 추가시켜주면 토큰은 처리되고

 

"//"(.)*	(/*do nothing*/)

이렇게 추가시켜주면 주석 처리를 할 수 있다.

 

--해석--

"//"는 //를 명령어로 해석하지 않고, 글자로 처리한다는 의미

.은 개행이 아닌 모든 문자

*이 붙으면 앞의 문자가 0번 이상 반복

즉, //로 시작하여 개행이 아닌 어떤 문자라도 0번이상 반복되면, 처리하지 않음이다.

 

'학교 공부 > 컴파일러(3-1)' 카테고리의 다른 글

[컴파일러] 11. 정규언어  (0) 2023.05.31
[컴파일러] 10. 형식언어  (0) 2023.05.30
[컴파일러] 9. Yacc  (0) 2023.04.14
[컴파일러] 8. Lex  (0) 2023.04.07
[컴파일러] 5. 어휘분석  (0) 2023.03.30
Comments