렉스(Lex) - Programming Languages & Compiler Research...

22
어휘 분석 생성기 : LEX 1 렉스(Lex) 렉스 레스크(Lesk, M.E.), 1975 어휘 분석기 생성기 소스 프로그램에 대해 정규 표현으로 기술된 토큰을 찾 아내는 프로그램을 작성하는데 유용한 도구 렉스의 기능 입력 : 사용자가 정의한 정규 표현실행 코드 출력 : C 언어로 쓰여진 프로그램 => lex.yy.c 입력 스트림에서 정규 표현에 해당하는 토큰을 찾 았을 때 실행 코드를 수행

Transcript of 렉스(Lex) - Programming Languages & Compiler Research...

Page 1: 렉스(Lex) - Programming Languages & Compiler Research …compiler.sangji.ac.kr/lecture/plt/2006_2/lex.pdf ·  · 2014-10-07어휘분석생성기: LEX 1 렉스(Lex) 렉스 레스크(Lesk,

어휘 분석 생성기 : LEX 1

렉스(Lex)Â렉스Â레스크(Lesk, M.E.), 1975Â어휘 분석기 생성기Â소스 프로그램에 대해 정규 표현으로 기술된 토큰을 찾

아내는 프로그램을 작성하는데 유용한 도구

Â렉스의 기능Â입력 : 사용자가 정의한 정규 표현과 실행 코드Â출력 : C 언어로 쓰여진 프로그램 => lex.yy.cÂ입력 스트림에서 정규 표현에 해당하는 토큰을 찾

았을 때 실행 코드를 수행

Page 2: 렉스(Lex) - Programming Languages & Compiler Research …compiler.sangji.ac.kr/lecture/plt/2006_2/lex.pdf ·  · 2014-10-07어휘분석생성기: LEX 1 렉스(Lex) 렉스 레스크(Lesk,

어휘 분석 생성기 : LEX 2

Â렉스의 역할

LEX

lex.yy.c

Lex source(*.ㅣ)

input text sequence of tokens(scanner)

Page 3: 렉스(Lex) - Programming Languages & Compiler Research …compiler.sangji.ac.kr/lecture/plt/2006_2/lex.pdf ·  · 2014-10-07어휘분석생성기: LEX 1 렉스(Lex) 렉스 레스크(Lesk,

어휘 분석 생성기 : LEX 3

렉스의 입력Â렉스의 입력(lex source)의 구성

{ 정의 부분 }%%{ 규칙 부분 } %%{ 사용자 부프로그램 부분 }

Â%%Â 각 부분의 구분자Â 각 부분은 반드시 순서적으로 기술

Page 4: 렉스(Lex) - Programming Languages & Compiler Research …compiler.sangji.ac.kr/lecture/plt/2006_2/lex.pdf ·  · 2014-10-07어휘분석생성기: LEX 1 렉스(Lex) 렉스 레스크(Lesk,

어휘 분석 생성기 : LEX 4

 <정의 부분>

%{/* This part is merely copied onto the generated program */

%}이름1 치환식1이름2 치환식2...

이름n 치환식n

Page 5: 렉스(Lex) - Programming Languages & Compiler Research …compiler.sangji.ac.kr/lecture/plt/2006_2/lex.pdf ·  · 2014-10-07어휘분석생성기: LEX 1 렉스(Lex) 렉스 레스크(Lesk,

어휘 분석 생성기 : LEX 5

Â%{ 와 %} 사이Â실행 코드를 C 언어로 기술할 때 필요한 자료 구조,

변수, 상수 정의Â렉스의 출력인 lex.yy.c의 앞 부분에 복사

Â이름 정의 부분Â특정한 정규 표현을 하나의 이름으로 정의, 정규 표현

에 대한 마크로Â이름, 최소한 한개 이상의 문자로 구성

Â치환식Â이름에 해당하는 정규 표현

Page 6: 렉스(Lex) - Programming Languages & Compiler Research …compiler.sangji.ac.kr/lecture/plt/2006_2/lex.pdf ·  · 2014-10-07어휘분석생성기: LEX 1 렉스(Lex) 렉스 레스크(Lesk,

어휘 분석 생성기 : LEX 6

Â예L [a-zA-Z_]D [0-9]%%{L} ( {L}|{D} )* return IDENT;

 [a-zA-Z_]([a-zA-Z_]|[0-9])*로 확장

Page 7: 렉스(Lex) - Programming Languages & Compiler Research …compiler.sangji.ac.kr/lecture/plt/2006_2/lex.pdf ·  · 2014-10-07어휘분석생성기: LEX 1 렉스(Lex) 렉스 레스크(Lesk,

어휘 분석 생성기 : LEX 7

 <규칙 부분>Â렉스 입력의 핵심 부분Â규칙 ::= 정규 표현 + 실행코드Â정규 표현 : 토큰의 형태를 표현Â실행 코드 : 토큰이 인식되었을 때 처리할 행위

%%R1 {A1}R2 {A2}

:Rn {An}

Page 8: 렉스(Lex) - Programming Languages & Compiler Research …compiler.sangji.ac.kr/lecture/plt/2006_2/lex.pdf ·  · 2014-10-07어휘분석생성기: LEX 1 렉스(Lex) 렉스 레스크(Lesk,

어휘 분석 생성기 : LEX 8

%%정의 부분과 규칙 부분을 구분하는 구분자

Ri정규 표현

Ai정규 표현에 대해 어휘 분석기가 해야 할 행위를 표현하는 실행 코드C 프로그램

Page 9: 렉스(Lex) - Programming Languages & Compiler Research …compiler.sangji.ac.kr/lecture/plt/2006_2/lex.pdf ·  · 2014-10-07어휘분석생성기: LEX 1 렉스(Lex) 렉스 레스크(Lesk,

어휘 분석 생성기 : LEX 9

Â규칙 부분의 예integer printf("found keyword INT");

Â입력 스트림에서 문자열 integer를 매칭했을때"found keyword INT"라는 메시지를 출력

 <사용자 부프로그램 부분>Â렉스의 입력 작성시 사용되는 부프로그램을 정의Â렉스에 의한 어떤 처리 없이 렉스의 출력인 lex.yy.c에

복사

Page 10: 렉스(Lex) - Programming Languages & Compiler Research …compiler.sangji.ac.kr/lecture/plt/2006_2/lex.pdf ·  · 2014-10-07어휘분석생성기: LEX 1 렉스(Lex) 렉스 레스크(Lesk,

어휘 분석 생성기 : LEX 10

렉스의 정규 표현Â렉스의 정규 표현Â텍스트 문자 + 연산자 문자Â텍스트 문자Â입력 스트림에서 실제로 매칭되는 부분

Â연산자 문자Â반복 또는 선택 등을 나타내는 특수 문자

Â연산자 문자의 종류와 의미

" ₩ [ ] ^ - ? . * + | ( ) $ / { } % < >

Page 11: 렉스(Lex) - Programming Languages & Compiler Research …compiler.sangji.ac.kr/lecture/plt/2006_2/lex.pdf ·  · 2014-10-07어휘분석생성기: LEX 1 렉스(Lex) 렉스 레스크(Lesk,

어휘 분석 생성기 : LEX 11

 " (double quote) " 사이에 있는 모든 문자는 텍스트 문자 a "*" b => 문자열 a*b

 ₩Â한개의 문자를 에스케이프Â한개의 문자를 텍스트 문자로 취급하고자 하는 경우,

특수 문자 앞에 덧붙임. XYZ++에 대한 정규 표현ÂXYZ"++", "XYZ++", XYZ₩+₩+

Page 12: 렉스(Lex) - Programming Languages & Compiler Research …compiler.sangji.ac.kr/lecture/plt/2006_2/lex.pdf ·  · 2014-10-07어휘분석생성기: LEX 1 렉스(Lex) 렉스 레스크(Lesk,

어휘 분석 생성기 : LEX 12

 [ ] : 문자 클래스 정의 [ a b c] : a,b,c 중 한 문자 []내에 사용된 연산자 문자의 의미는 무시 -, ^, ₩ 문자는 [ ]내에서 특별한 의미를 갖음 - : 범위(range)를 나타내는 연산자 문자 [a-z] : a부터 z사이의 문자 중 한 문자 [-+0-9] : 부호와 숫자를 포함하는 숫자 클래스 [A-Za-z0-9] : 영문자와 숫자중의 한 문자

Page 13: 렉스(Lex) - Programming Languages & Compiler Research …compiler.sangji.ac.kr/lecture/plt/2006_2/lex.pdf ·  · 2014-10-07어휘분석생성기: LEX 1 렉스(Lex) 렉스 레스크(Lesk,

어휘 분석 생성기 : LEX 13

 ^ : 여집합(complement) [^*], *를 제외한 모든 문자 [^a-zA-Z], 영문자를 제외한 모든 문자

Â₩ : C 언어의 에스케이프 문자열Â [ ₩t₩n] : 공백, 탭, 개행 문자중 하나Â [₩40-₩176] : ASCII 값 40인 공백(blank)부터

176인 ~(tilde)까지의 모든 인쇄 가능한 문자 클래스

Page 14: 렉스(Lex) - Programming Languages & Compiler Research …compiler.sangji.ac.kr/lecture/plt/2006_2/lex.pdf ·  · 2014-10-07어휘분석생성기: LEX 1 렉스(Lex) 렉스 레스크(Lesk,

어휘 분석 생성기 : LEX 14

 * : 0번 이상 반복 a* : a가 0번 이상 반복 [a-zA-Z][a-zA-Z0-9]* : 첫문자가 영문자인 단어

 + : 한번 이상 반복 a+ : 문자 a가 한번 이상 반복 [a-z]+ : 소문자로 이루어진 단어

 ? : 선택을 의미하는 연산자 ab?c는 b가 선택적, abc 또는 ac

Page 15: 렉스(Lex) - Programming Languages & Compiler Research …compiler.sangji.ac.kr/lecture/plt/2006_2/lex.pdf ·  · 2014-10-07어휘분석생성기: LEX 1 렉스(Lex) 렉스 레스크(Lesk,

어휘 분석 생성기 : LEX 15

 | : 택일을 위한 연산자 (ab|cd) : ab 또는 cd를 인식Â괄호, 복잡한 식을 표현 (ab|cd+)?(ef)* : abefef, efefef, cdef, cddd 등 ('+'|'-')[0-9]+ : 부호가 있는 정수

 ^ : 라인의 시작에서만 인식 ^abc : 라인의 시작에 문자열 abc가 나타났을 때에

만 토큰으로 abc를 처리

Page 16: 렉스(Lex) - Programming Languages & Compiler Research …compiler.sangji.ac.kr/lecture/plt/2006_2/lex.pdf ·  · 2014-10-07어휘분석생성기: LEX 1 렉스(Lex) 렉스 레스크(Lesk,

어휘 분석 생성기 : LEX 16

 $ : 오직 라인의 끝에서만 인식

 / : 접미 문맥을 명시 ab/cd, ab 다음에 cd가 이어서 나타날 때만 ab가 토

큰으로 처리Â . : Â .(period)는 newline 문자를 제외한 모든 문자Â "--".* 는 -- 부터 한 라인의 끝

 { } : 정의된 이름을 치환식으로 확장

Page 17: 렉스(Lex) - Programming Languages & Compiler Research …compiler.sangji.ac.kr/lecture/plt/2006_2/lex.pdf ·  · 2014-10-07어휘분석생성기: LEX 1 렉스(Lex) 렉스 레스크(Lesk,

어휘 분석 생성기 : LEX 17

렉스의 실행 코드(actions)Â실행 코드 부분Â토큰이 인식되었을 때 수행해야 할 행위를 C 언어로

기술Â인식되지 않은 모든 문자에 대해서는 입력을 출력으로

복사Â널 문장(null statement)Â어떤 행위도 수행할 필요가 없는 문자열에 대한 처

리Â [ ₩t₩n] ;Â 공백, 탭, 개행 문자를 입력에서 무시하고자 할 경

Page 18: 렉스(Lex) - Programming Languages & Compiler Research …compiler.sangji.ac.kr/lecture/plt/2006_2/lex.pdf ·  · 2014-10-07어휘분석생성기: LEX 1 렉스(Lex) 렉스 레스크(Lesk,

어휘 분석 생성기 : LEX 18

 yytextÂ렉스의 전역 변수, 문자 배열형(character array)Â정규 표현에 의해 실제로 매칭된 문자열 값을 저장

[a-z]+ printf(“%s”, yytext) ;

Â토큰 값이 필요한 경우, 변수 yytext의 내용을 사용Â매칭된 문자열을 출력Â [a-z]+ ECHO ;

Page 19: 렉스(Lex) - Programming Languages & Compiler Research …compiler.sangji.ac.kr/lecture/plt/2006_2/lex.pdf ·  · 2014-10-07어휘분석생성기: LEX 1 렉스(Lex) 렉스 레스크(Lesk,

어휘 분석 생성기 : LEX 19

Â전역 변수Â yytext :Â yyleng : 매칭된 문자열의 길이를 저장하고 있는 변수.

Â함수Â yymore()Â매칭된 문자열의 끝에 다음에 인식될 문자열 첨가

 yyless(n)Ân개의 문자만을 yytext에 남겨두고 나머지는 다시

처리하기 위하여 입력 스트림으로 되돌려 보내는함수.

Page 20: 렉스(Lex) - Programming Languages & Compiler Research …compiler.sangji.ac.kr/lecture/plt/2006_2/lex.pdf ·  · 2014-10-07어휘분석생성기: LEX 1 렉스(Lex) 렉스 레스크(Lesk,

어휘 분석 생성기 : LEX 20

 yywrap()Â렉스가 입력의 끝을 만났을 때 호출하는 함수Â정상적인 경우에 이 함수의 복귀값은 1이 된다.

Page 21: 렉스(Lex) - Programming Languages & Compiler Research …compiler.sangji.ac.kr/lecture/plt/2006_2/lex.pdf ·  · 2014-10-07어휘분석생성기: LEX 1 렉스(Lex) 렉스 레스크(Lesk,

어휘 분석 생성기 : LEX 21

Â입출력 함수Â input()Â입력 스트림으로부터 다음 문자를 읽는 함수.

 output(c)Â출력 스트림으로 문자 c를 내보내는 함수.

 unput(c)Â함수 input()에 의해 다시 읽혀지도록 문자 c를 입

력 스트림으로 되돌려 보내는 기능을 하는 함수.

Â예6, 교재 PP.149 참고

Page 22: 렉스(Lex) - Programming Languages & Compiler Research …compiler.sangji.ac.kr/lecture/plt/2006_2/lex.pdf ·  · 2014-10-07어휘분석생성기: LEX 1 렉스(Lex) 렉스 레스크(Lesk,

어휘 분석 생성기 : LEX 22

스캐너 생성 및 동작Â렉스를 이용한 스캐너 생성 과정

Lex ccLex source lex.yy.c a.out

library

사용법(usage)lex test.lcc lex.yy.c –o test –lltest < test.dat