%option noyywrap
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "y.tab.h"
int current_line = 1; // 현재 줄 번호
int current_column = 1; // 현재 열 위치
%}
%%
\n {
current_line++;
current_column = 1;
return *yytext;
}
[0-9]+ {
current_column += yyleng;
yylval.ival = atoi(yytext);
return NUM;
}
[a-zA-Z_][a-zA-Z0-9_]* {
current_column += yyleng;
yylval.sval = strdup(yytext);
return ID;
}
[-+*/()=$] {
current_column += yyleng;
return *yytext;
}
[ \t] {
current_column += yyleng;
}
. {
current_column += yyleng;
printf("해당문법은 없습니다. '%s' (줄 %d, 열 %d)\n", yytext, current_line, current_column - yyleng);
}
%%
text
%option noyywrap
lex에게 yywrap 함수를 사용하지 않겠다고 알려준다. 이는 입력의 끝을 처리하는 기본 동작을 사용하겠다는 의미이다.
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "y.tab.h"
int current_line = 1; // 현재 줄 번호
int current_column = 1; // 현재 열 위치
%}
C 코드 섹션을 시작한다. 필요한 헤더 파일을 포함하고 전역 변수와 함수를 정의한다..
%%
규칙 섹션의 시작을 나타낸다.
\n {
current_line++;
yycolumn = 1;
return *yytext;
}
개행 문자를 만나면 줄 번호를 증가시키고 열 위치를 1로 리셋한다.
yytext
yytext는 Lex/Flex에서 매우 중요한 역할을 하는 변수이다.
현재 매칭된 토큰의 텍스트를 저장한다. 즉, 렉서가 입력에서 인식한 가장 최근의 토큰 문자열을 포함합니다. 위 같은 경우 '\n'이다.
문자 배열(char array) 형태로 선언되어 있다. 일반적으로 정적 배열로 선언되어 있어 Lex/Flex 내부에서 관리된다.
토큰 처리 시 해당 토큰의 값이나 속성을 추출하는 데 사용된다.
예를 들어:
숫자 토큰의 경우: yylval.ival = atoi(yytext);
식별자 토큰의 경우: yylval.sval = strdup(yytext);
매칭된 토큰의 텍스트를 그대로 출력하거나 다른 처리를 할 때 사용할 수 있다. 예: printf("%s", yytext);
yytext와 함께 자주 사용되는 yyleng 변수는 현재 매칭된 토큰의 길이를 나타냅니다.
Yacc/Bison과 함께 사용할 때, yytext의 내용은 파서(parser)에 전달되어 구문 분석에 활용될 수 있다.
요약하면, yytext는 렉서가 인식한 현재 토큰의 실제 텍스트를 담고 있어, 토큰 처리와 파싱 과정에서 중요한 역할을 한다.
[0-9]+ {
current_column += yyleng;
yylval.ival = atoi(yytext);
return NUM;
}
하나 이상의 숫자를 인식하고, 이를 정수로 변환하여 NUM 토큰으로 반환한다.
[a-zA-Z_][a-zA-Z0-9_]* {
current_column += yyleng;
yylval.sval = strdup(yytext);
return ID;
}
식별자(변수명 등)를 인식하고 ID 토큰으로 반환한다.
[-+*/()=$] {
current_column += yyleng;
return *yytext;
}
연산자와 구분자를 인식하고 해당 문자를 그대로 반환한다.
[ \t] {
current_column += yyleng;
}
공백과 탭을 무시하되, 열 위치는 업데이트한다.
. {
current_column += yyleng;
printf("해당문법은 없습니다. '%s' (줄 %d, 열 %d)\n", yytext, current_line, current_column - yyleng);
}
위의 규칙에 맞지 않는 모든 문자에 대해 오류 메시지를 출력한다.
%%
lex 정의의 끝을 나타낸다.