렉스(Lex) - Programming Languages & Compiler Research...
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,](https://reader034.fdocument.pub/reader034/viewer/2022050722/5af50f197f8b9ae9488cf129/html5/thumbnails/1.jpg)
어휘 분석 생성기 : 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,](https://reader034.fdocument.pub/reader034/viewer/2022050722/5af50f197f8b9ae9488cf129/html5/thumbnails/2.jpg)
어휘 분석 생성기 : 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,](https://reader034.fdocument.pub/reader034/viewer/2022050722/5af50f197f8b9ae9488cf129/html5/thumbnails/3.jpg)
어휘 분석 생성기 : 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,](https://reader034.fdocument.pub/reader034/viewer/2022050722/5af50f197f8b9ae9488cf129/html5/thumbnails/4.jpg)
어휘 분석 생성기 : 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,](https://reader034.fdocument.pub/reader034/viewer/2022050722/5af50f197f8b9ae9488cf129/html5/thumbnails/5.jpg)
어휘 분석 생성기 : 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,](https://reader034.fdocument.pub/reader034/viewer/2022050722/5af50f197f8b9ae9488cf129/html5/thumbnails/6.jpg)
어휘 분석 생성기 : 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,](https://reader034.fdocument.pub/reader034/viewer/2022050722/5af50f197f8b9ae9488cf129/html5/thumbnails/7.jpg)
어휘 분석 생성기 : 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,](https://reader034.fdocument.pub/reader034/viewer/2022050722/5af50f197f8b9ae9488cf129/html5/thumbnails/8.jpg)
어휘 분석 생성기 : 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,](https://reader034.fdocument.pub/reader034/viewer/2022050722/5af50f197f8b9ae9488cf129/html5/thumbnails/9.jpg)
어휘 분석 생성기 : 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,](https://reader034.fdocument.pub/reader034/viewer/2022050722/5af50f197f8b9ae9488cf129/html5/thumbnails/10.jpg)
어휘 분석 생성기 : 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,](https://reader034.fdocument.pub/reader034/viewer/2022050722/5af50f197f8b9ae9488cf129/html5/thumbnails/11.jpg)
어휘 분석 생성기 : 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,](https://reader034.fdocument.pub/reader034/viewer/2022050722/5af50f197f8b9ae9488cf129/html5/thumbnails/12.jpg)
어휘 분석 생성기 : 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,](https://reader034.fdocument.pub/reader034/viewer/2022050722/5af50f197f8b9ae9488cf129/html5/thumbnails/13.jpg)
어휘 분석 생성기 : 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,](https://reader034.fdocument.pub/reader034/viewer/2022050722/5af50f197f8b9ae9488cf129/html5/thumbnails/14.jpg)
어휘 분석 생성기 : 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,](https://reader034.fdocument.pub/reader034/viewer/2022050722/5af50f197f8b9ae9488cf129/html5/thumbnails/15.jpg)
어휘 분석 생성기 : 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,](https://reader034.fdocument.pub/reader034/viewer/2022050722/5af50f197f8b9ae9488cf129/html5/thumbnails/16.jpg)
어휘 분석 생성기 : 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,](https://reader034.fdocument.pub/reader034/viewer/2022050722/5af50f197f8b9ae9488cf129/html5/thumbnails/17.jpg)
어휘 분석 생성기 : 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,](https://reader034.fdocument.pub/reader034/viewer/2022050722/5af50f197f8b9ae9488cf129/html5/thumbnails/18.jpg)
어휘 분석 생성기 : 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,](https://reader034.fdocument.pub/reader034/viewer/2022050722/5af50f197f8b9ae9488cf129/html5/thumbnails/19.jpg)
어휘 분석 생성기 : 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,](https://reader034.fdocument.pub/reader034/viewer/2022050722/5af50f197f8b9ae9488cf129/html5/thumbnails/20.jpg)
어휘 분석 생성기 : 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,](https://reader034.fdocument.pub/reader034/viewer/2022050722/5af50f197f8b9ae9488cf129/html5/thumbnails/21.jpg)
어휘 분석 생성기 : 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,](https://reader034.fdocument.pub/reader034/viewer/2022050722/5af50f197f8b9ae9488cf129/html5/thumbnails/22.jpg)
어휘 분석 생성기 : LEX 22
스캐너 생성 및 동작Â렉스를 이용한 스캐너 생성 과정
Lex ccLex source lex.yy.c a.out
library
사용법(usage)lex test.lcc lex.yy.c –o test –lltest < test.dat