flex 실습

공부용·2025년 11월 4일

Flex

Flex는 어휘 분석기 생성기(Lexical Analyzer Generator)이다.

1. C 코드 자동 생성

Flex는 프로그래머가 C 코드를 직접 다 짜지 않고도 어휘 분석기를 생성하도록 도와주는 도구이다.
test.l파일에 토큰이 무엇인지에 대한 규칙을 정의한다.

begin							return(TBEGIN);
end								return(TEND);
{letter}({letter}|{digit})*		return(TIDEN);
":="							return(TASSIGN);
"+"								return(TADD);
{digit}+						return(TNUM);
";"								return(TSEMI);
\.								return(TDOT);
  • begin 이라는 글자는 TBEGIN토큰이다.
  • [a-zA-Z]+ (알파벳 연속)은 TIDEN (식별자) 토큰이다.
  • [0-9]+ (숫자 연속)은 TNUM (숫자) 토큰이다.
  • [ \t\n\r]+ (공백, 탭, 줄바꿈)은 무시한다.

2. 어휘 분석

어휘 분석은 컴파일러의 첫 번째 단계이다.
단어들을 쪼개서 토큰으로 인식하게 하는 역할을 하는 프로그램이다.
아래와 같은 text파일이 있을 때 토큰을 인식한다.

begin
num := 0;
num := num + 526;
end.
  • num -> 식별자(TIDEN)
  • := -> 할당 연산자(TASSIGN)
  • num -> 식별자(TIDEN)
  • + -> 덧셈 연산자(TADD)
  • 526 -> 숫자(TNUM)
  • ; -> 세미콜론(TSEMI)

실습 파일

test.l: Lex(Flex) 정의 파일이다. begin, end, 숫자, 식별자 등 토큰의 규칙을 정의한다.
lex.yy.c: test.l 파일을 flex 도구로 변환한 C 소스 코드 파일이다. 이 파일이 실제 어휘 분석기(스캐너)의 본체이다.
test.txt: 캐너가 읽어 들일 테스트용 입력 파일이다.

컴파일 및 실행 방법

.l확장자 파일인 Lex의 정의를 .c파일로 변환한 뒤, 이 C 코드를 컴파일하는 전체 과정을 실습한다.

먼저 실리콘 Mac 기준으로 Flex와 gcc를 설치하고 진행한다.

1. flex로 lex.yy.c 생성하기:

터미널에서 test.l 파일이 있는 폴더로 이동한 뒤, 다음 명령어를 실행한다.

flex test.l

이 명령어는 test.l파일을 읽어 lex.yy.c라는 C 소스코드 파일을 생성하거나 덮어쓴다.

2. clang으로 C 코드 컴파일하기:

생성된 C 코드를 컴파일하여 실행 가능한 파일로 만든다.

clang -o lex.yy lex.yy.c

3. 프로그램 실행:

text 파일 내용

test.txt 파일을 새로 만든 lex.yy 프로그램의 입력으로 넣어 실행한다.

./lex.yy < test.txt

시행착오

처음 스캐너를 통해 test.txt파일을 읽어드렸을 때에는 실행 결과에 오류가 포함되어 있었다.

Begin, Semicolon, Semicolon의 뒤에서 오류가 발생한 것으로 보아 원본 텍스트의 줄바꿈에서 발생하던 오류였다.

flex 생성을 위한 test.l 파일에서 줄바꿈을 제대로 처리하는지 살펴봤다.
17번 째 줄에서 공백( ) 탭(\t)과 유닉스 개행(\n)을 무시하도록 되어있었다.

[ \t\n]				;

하지만 제공된 text파일은 개행이 CRLF(윈도우 식 개행)으로 설정되어있어서 어휘 분석기에 문제가 생긴 것이었다.

이를 LF(유닉스 식 개행)으로 바꾸어주었더니 ERROR가 사라졌다.

profile
공부 내용을 가볍게 적어놓는 블로그.

0개의 댓글