2012 - 2 Video & Image Processing Lab. VIPL Compiler Construction 한국방송통신대학교 컴퓨터과학과 출석수업 공학박사 김명진 (HCI & 지능형로봇연구소) 숭실대학교 연구교수 제3장 어휘분석
2012 - 2
Video & Image Processing Lab. VIPL
Compiler Construction 한국방송통신대학교
컴퓨터과학과 출석수업
공학박사 김명진 (HCI & 지능형로봇연구소) 숭실대학교 연구교수
제3장 어휘분석
컴파일러구성 3장 어휘분석
숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)
2장 : 형식언어와 오토마타
3장 : 어휘분석
4장 : Contex-free 언어와
푸시다운 오토마타
5장 : 구문분석
컴파일러 교재구성
2
컴파일러구성 3장 어휘분석
숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)
어휘 분석
어휘분석이란? 원시 프로그램을 읽어들여 토큰이라는
의미있는 문법 단위로 분리하는 것
원시 프로그램: If a ≥ 10 then …
토큰(token) : if, a, ≥, 10, then
토큰번호: 29, 1, 20, 2, 35
3
컴파일러구성 3장 어휘분석
숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)
컴파일러 구조
어휘분석기
구문분석기
중간코드생성기
코드최적화기
목적코드생성기
토큰
중간코드
트리
Source Program
Object Program
Compiler
4
컴파일러구성 3장 어휘분석
숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)
어휘 분석기
소스 프로그램(S.P)을 문법적으로 의미있는 최소 단위로 분할
원시 프로그램 어휘분석기
일련의 토큰
5
컴파일러구성 3장 어휘분석
숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)
토큰의 종류
(1) 식별자(identifier)
(2) 상수(constant)
(3) 예약어(reserved word)
(4) 연산자(operator)
(5) 구분자(delimiter)
어휘분석기 설계
6
컴파일러구성 3장 어휘분석
숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)
1
2
32
52
53
54
55
예약어표 검 색 3
4
not found
found
식별자
예약어 33 숫자
39
43
42
40
41
44
46
51
45
not d
not l d
A
l d
b
not =
not .
not =
not >,=
=
=
=
>
l
d
<
>
:
. .
d
A
38
49
50
34
35
36
37
47
45
48
=
)
+
*
/
,
.
;
(
start
not l d
b=blank l=letter d=digit
컴파일러구성 3장 어휘분석
숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)
1
2
32
예약어표 검 색 3
4
not found
found
식별자
예약어
33 숫자
not d
b
l
d
d
l d
not l d
8
컴파일러구성 3장 어휘분석
숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)
O
56 15
A
A
start 57 58
N D
59 7 R
60 61 A Y
63 18 G
64 65 I N
62 E B
67 23 S
68 E
66 A
70 5 S
71 T
69 N
C
73 13 V
72 I D
74 29 N
75 76 T O
25 O W
78 22 E L
77 S
31 E
79 10 D N
81 28 R
80 O F
83 17 C
84 85 T I
82 N
86 87 N U
20 88 F I
90 14 D
89 O M
92 19 T
91 O N
R
O
9
컴파일러구성 3장 어휘분석
숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)
I
A
95 O
96 97 C E
94 R P
110 26 E
111 112 A T P
115 21 N H
114 E T
30 O
117 6 E
116 P Y
27 U
118 119 N T
120 121 L
8 93 F O
16 U
12 98 D
99 100 R
101 E
R 4 102 103
A 104
M G
106 9 C
107 108 O R
105 E R
109 D
113
123 11 R
122 A V
L 24
W 124 125
H I 126 127
E
R
10
컴파일러구성 3장 어휘분석
숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)
어휘 분석기 구현 방법
프로그래밍 언어를 이용하여 직접 구현
컴파일러 자동화 도구를 이용하여 구현
어휘분석기 생성기 종류 LEX
FLEX
ScanGen
PCLEX
POISON
JLEX
11
컴파일러구성 3장 어휘분석
숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)
컴파일러 생성기 모델
Executable form on M
Language Description : L
컴파일러 컴파일러 생성기 Machine
Description : M
Program written in L
12
컴파일러구성 3장 어휘분석
숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)
어휘 분석기 생성기
LEX: 1975년에 M.E.Leak 가 고안
토큰을 구분하는 프로그램 작성도구
토큰구조 (정규표현)
어휘분석기 (Scanner)
LEX
원시프로그램
일련의 토큰
13
컴파일러구성 3장 어휘분석
숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)
상태전이표를 갖는 어휘분석기
LEX
일련의 토큰들
원시 프로그램
LEX 의 입력
LEX 의 역할
PCLEX 소개
14
컴파일러구성 3장 어휘분석
숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)
LEX의 기능
(lex.yy.c)
LEX
어휘분석용 소스프로그램
정규표현(*.L)
원시프로그램 일련의 토큰
컴파일
어휘분석기
15
컴파일러구성 3장 어휘분석
숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)
LEX 입력 명세서
사용형식
{정의부분}
%% //규칙시작표시, 생략 불가능
{규칙부분} //규칙부분::= 정규표현 + 수행코드
%%
{사용자 부프로그램} 16
컴파일러구성 3장 어휘분석
숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)
LEX 정규표현
::=텍스트 문자 + 연산자 문자
텍스트 문자 비교대상의 스트링문자로 알파벳과 숫자
연산자 문자 “ \ [] ^ - ? . * + () $ / {} % <>
17
컴파일러구성 3장 어휘분석
숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)
LEX 수행코드
정규표현이 매칭되면 즉, 토큰이 인식되었을 때 실행해야 할 행동을 C언어로 기술하는 부분
수행코드 구성
전역변수
함수
I/O 루틴(입출력함수)
18
컴파일러구성 3장 어휘분석
숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)
LEX 수행코드
전역변수
yytext 정규표현과 매칭된 실제 문자열 보관 변수 [a-z]+ printf(“%s”, yytext);
yyleng 매칭된 문자열의 길이를 저장하는 변수
yytext[yyleng-1]
매칭된 스트링의 마지막 문자
19
컴파일러구성 3장 어휘분석
숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)
LEX 수행코드
함수
yylex() LEX 입력에서 명시한 정규표현과 일치하는 토큰을 찾을 때까지 한 문자씩 계속 읽음
yymore() 현재 매칭된 문자열의 끝에 다음에 인식될 문자열을 덧붙이는 함수
20
컴파일러구성 3장 어휘분석
숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)
LEX 수행코드
함수
yyless(n) n개의 문자만을 yytext에 남겨두고 나머지는 다시 처리하기 위해 input으로 되돌려 보내는 함수.
yywrap() Lex가 입력의 끝을 만났을때 호출하는 함수.
정상인 경우 : 함수 복귀값은 1
21
컴파일러구성 3장 어휘분석
숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)
LEX 수행코드
I/O 루틴
input() 입력 스트림으로부터 다음 문자를 읽는 함수.
output(c) 출력 스트림으로 문자 c를 내보내는 함수
unput(c) input()에 의해 읽혀지도록 문자 c를 입력 스트림으로 되돌려보내는 함수
22
컴파일러구성 3장 어휘분석
숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)
LEX 활용 사례
원시프로그램(datafile)
토큰 LIST(10 개)
ABC := E * 314 + ABC / E ;
ABC, :=, E, *, 314, +, ABC, /, E, ;
23
컴파일러구성 3장 어휘분석
숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)
LEX 활용 사례
정의부분 %{ /* 생성된 프로그램에 그대로 copy됨 */ #include <stdio.h> #include <stdlib.h> enum tnumber {TEOF, TIDEN, TNUM, TASSIGN,
TADD, TPOINT, TMUL, TDIV, TSEMI, TDOT, TBEGIN, TEND, TERROR};
%} /* 이름n 치환식 */ letter [a-zA-Z] digit [0-9]
24
컴파일러구성 3장 어휘분석
숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)
LEX 활용 사례
규칙부분 %% begin return(TBEGIN); end return(TEND); {letter}({letter}|{digit})* return(TIDEN); :=“ return(TASSIGN); +” return(TADD); *” return(TMUL); /” return(TDIV); {digit}+ return(TNUM); ;” return(TSEMI); \. return(TDOT); [ \t\n] ; . return(TERROR);
25
컴파일러구성 3장 어휘분석
숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)
LEX 활용 사례
사용자 부프로그램 부분 %% main() { enum tnumber tn; /* token number */ printf(“ Start of LEX \n”); while ((tn = yylex() != TEOF) switch (tn) { case TBEGIN : printf(“Begin \n”); break; case TEND : printf(“End \n”); break; case TIDEN : printf(“Identifier : %s\n”, yytext); break; case TASSIGN : printf(“Assign_op \n”); break; case TADD : printf(“Add_op \n”); break; case TMUL : printf(“Mul_op \n”); break; case TDIV : printf(“Div_op \n”); break; case TNUM : printf(“Number: %s\n”, atoi(yytext)); break; case TSEMI : printf(“Semicolon \n”); break; case TDOT : printf(“Dot \n”); break; case TERROR : printf(“Error \n”); break; } yywrap() {printf(“ End of LEX \=n”); return 1; } } 26
컴파일러구성 3장 어휘분석
숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)
LEX 실행 절차
LEX cc LEX명세 (TEST.L) Lex.yy.c a.out
library PC환경에서 실행법
C > PCL32 -i TEST.L C > cc -c -o test.c C > TEST < datafile
27