렉스(Lex) - Programming Languages & Compiler Research...
Transcript of 렉스(Lex) - Programming Languages & Compiler Research...
어휘 분석 생성기 : LEX 1
렉스(Lex)Â렉스Â레스크(Lesk, M.E.), 1975Â어휘 분석기 생성기Â소스 프로그램에 대해 정규 표현으로 기술된 토큰을 찾
아내는 프로그램을 작성하는데 유용한 도구
Â렉스의 기능Â입력 : 사용자가 정의한 정규 표현과 실행 코드Â출력 : C 언어로 쓰여진 프로그램 => lex.yy.cÂ입력 스트림에서 정규 표현에 해당하는 토큰을 찾
았을 때 실행 코드를 수행
어휘 분석 생성기 : LEX 2
Â렉스의 역할
LEX
lex.yy.c
Lex source(*.ㅣ)
input text sequence of tokens(scanner)
어휘 분석 생성기 : LEX 3
렉스의 입력Â렉스의 입력(lex source)의 구성
{ 정의 부분 }%%{ 규칙 부분 } %%{ 사용자 부프로그램 부분 }
Â%%Â 각 부분의 구분자Â 각 부분은 반드시 순서적으로 기술
어휘 분석 생성기 : LEX 4
 <정의 부분>
%{/* This part is merely copied onto the generated program */
%}이름1 치환식1이름2 치환식2...
이름n 치환식n
어휘 분석 생성기 : LEX 5
Â%{ 와 %} 사이Â실행 코드를 C 언어로 기술할 때 필요한 자료 구조,
변수, 상수 정의Â렉스의 출력인 lex.yy.c의 앞 부분에 복사
Â이름 정의 부분Â특정한 정규 표현을 하나의 이름으로 정의, 정규 표현
에 대한 마크로Â이름, 최소한 한개 이상의 문자로 구성
Â치환식Â이름에 해당하는 정규 표현
어휘 분석 생성기 : LEX 6
Â예L [a-zA-Z_]D [0-9]%%{L} ( {L}|{D} )* return IDENT;
 [a-zA-Z_]([a-zA-Z_]|[0-9])*로 확장
어휘 분석 생성기 : LEX 7
 <규칙 부분>Â렉스 입력의 핵심 부분Â규칙 ::= 정규 표현 + 실행코드Â정규 표현 : 토큰의 형태를 표현Â실행 코드 : 토큰이 인식되었을 때 처리할 행위
%%R1 {A1}R2 {A2}
:Rn {An}
어휘 분석 생성기 : LEX 8
%%정의 부분과 규칙 부분을 구분하는 구분자
Ri정규 표현
Ai정규 표현에 대해 어휘 분석기가 해야 할 행위를 표현하는 실행 코드C 프로그램
어휘 분석 생성기 : LEX 9
Â규칙 부분의 예integer printf("found keyword INT");
Â입력 스트림에서 문자열 integer를 매칭했을때"found keyword INT"라는 메시지를 출력
 <사용자 부프로그램 부분>Â렉스의 입력 작성시 사용되는 부프로그램을 정의Â렉스에 의한 어떤 처리 없이 렉스의 출력인 lex.yy.c에
복사
어휘 분석 생성기 : LEX 10
렉스의 정규 표현Â렉스의 정규 표현Â텍스트 문자 + 연산자 문자Â텍스트 문자Â입력 스트림에서 실제로 매칭되는 부분
Â연산자 문자Â반복 또는 선택 등을 나타내는 특수 문자
Â연산자 문자의 종류와 의미
" ₩ [ ] ^ - ? . * + | ( ) $ / { } % < >
어휘 분석 생성기 : LEX 11
 " (double quote) " 사이에 있는 모든 문자는 텍스트 문자 a "*" b => 문자열 a*b
 ₩Â한개의 문자를 에스케이프Â한개의 문자를 텍스트 문자로 취급하고자 하는 경우,
특수 문자 앞에 덧붙임. XYZ++에 대한 정규 표현ÂXYZ"++", "XYZ++", XYZ₩+₩+
어휘 분석 생성기 : LEX 12
 [ ] : 문자 클래스 정의 [ a b c] : a,b,c 중 한 문자 []내에 사용된 연산자 문자의 의미는 무시 -, ^, ₩ 문자는 [ ]내에서 특별한 의미를 갖음 - : 범위(range)를 나타내는 연산자 문자 [a-z] : a부터 z사이의 문자 중 한 문자 [-+0-9] : 부호와 숫자를 포함하는 숫자 클래스 [A-Za-z0-9] : 영문자와 숫자중의 한 문자
어휘 분석 생성기 : LEX 13
 ^ : 여집합(complement) [^*], *를 제외한 모든 문자 [^a-zA-Z], 영문자를 제외한 모든 문자
Â₩ : C 언어의 에스케이프 문자열Â [ ₩t₩n] : 공백, 탭, 개행 문자중 하나Â [₩40-₩176] : ASCII 값 40인 공백(blank)부터
176인 ~(tilde)까지의 모든 인쇄 가능한 문자 클래스
어휘 분석 생성기 : LEX 14
 * : 0번 이상 반복 a* : a가 0번 이상 반복 [a-zA-Z][a-zA-Z0-9]* : 첫문자가 영문자인 단어
 + : 한번 이상 반복 a+ : 문자 a가 한번 이상 반복 [a-z]+ : 소문자로 이루어진 단어
 ? : 선택을 의미하는 연산자 ab?c는 b가 선택적, abc 또는 ac
어휘 분석 생성기 : LEX 15
 | : 택일을 위한 연산자 (ab|cd) : ab 또는 cd를 인식Â괄호, 복잡한 식을 표현 (ab|cd+)?(ef)* : abefef, efefef, cdef, cddd 등 ('+'|'-')[0-9]+ : 부호가 있는 정수
 ^ : 라인의 시작에서만 인식 ^abc : 라인의 시작에 문자열 abc가 나타났을 때에
만 토큰으로 abc를 처리
어휘 분석 생성기 : LEX 16
 $ : 오직 라인의 끝에서만 인식
 / : 접미 문맥을 명시 ab/cd, ab 다음에 cd가 이어서 나타날 때만 ab가 토
큰으로 처리Â . : Â .(period)는 newline 문자를 제외한 모든 문자Â "--".* 는 -- 부터 한 라인의 끝
 { } : 정의된 이름을 치환식으로 확장
어휘 분석 생성기 : LEX 17
렉스의 실행 코드(actions)Â실행 코드 부분Â토큰이 인식되었을 때 수행해야 할 행위를 C 언어로
기술Â인식되지 않은 모든 문자에 대해서는 입력을 출력으로
복사Â널 문장(null statement)Â어떤 행위도 수행할 필요가 없는 문자열에 대한 처
리Â [ ₩t₩n] ;Â 공백, 탭, 개행 문자를 입력에서 무시하고자 할 경
우
어휘 분석 생성기 : LEX 18
 yytextÂ렉스의 전역 변수, 문자 배열형(character array)Â정규 표현에 의해 실제로 매칭된 문자열 값을 저장
[a-z]+ printf(“%s”, yytext) ;
Â토큰 값이 필요한 경우, 변수 yytext의 내용을 사용Â매칭된 문자열을 출력Â [a-z]+ ECHO ;
어휘 분석 생성기 : LEX 19
Â전역 변수Â yytext :Â yyleng : 매칭된 문자열의 길이를 저장하고 있는 변수.
Â함수Â yymore()Â매칭된 문자열의 끝에 다음에 인식될 문자열 첨가
 yyless(n)Ân개의 문자만을 yytext에 남겨두고 나머지는 다시
처리하기 위하여 입력 스트림으로 되돌려 보내는함수.
어휘 분석 생성기 : LEX 20
 yywrap()Â렉스가 입력의 끝을 만났을 때 호출하는 함수Â정상적인 경우에 이 함수의 복귀값은 1이 된다.
어휘 분석 생성기 : LEX 21
Â입출력 함수Â input()Â입력 스트림으로부터 다음 문자를 읽는 함수.
 output(c)Â출력 스트림으로 문자 c를 내보내는 함수.
 unput(c)Â함수 input()에 의해 다시 읽혀지도록 문자 c를 입
력 스트림으로 되돌려 보내는 기능을 하는 함수.
Â예6, 교재 PP.149 참고
어휘 분석 생성기 : LEX 22
스캐너 생성 및 동작Â렉스를 이용한 스캐너 생성 과정
Lex ccLex source lex.yy.c a.out
library
사용법(usage)lex test.lcc lex.yy.c –o test –lltest < test.dat