Top Banner
2012 - 2 Video & Image Processing Lab. VIPL Compiler Construction 한국방송통신대학교 컴퓨터과학과 출석수업 공학박사 김명진 (HCI & 지능형로봇연구소) 숭실대학교 연구교수 3어휘분석
28

3장 어휘분석 - 한국방송통신대학교

May 02, 2023

Download

Documents

Khang Minh
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 3장 어휘분석 - 한국방송통신대학교

2012 - 2

Video & Image Processing Lab. VIPL

Compiler Construction 한국방송통신대학교

컴퓨터과학과 출석수업

공학박사 김명진 (HCI & 지능형로봇연구소) 숭실대학교 연구교수

제3장 어휘분석

Page 2: 3장 어휘분석 - 한국방송통신대학교

컴파일러구성 3장 어휘분석

숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)

2장 : 형식언어와 오토마타

3장 : 어휘분석

4장 : Contex-free 언어와

푸시다운 오토마타

5장 : 구문분석

컴파일러 교재구성

2

Page 3: 3장 어휘분석 - 한국방송통신대학교

컴파일러구성 3장 어휘분석

숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)

어휘 분석

어휘분석이란? 원시 프로그램을 읽어들여 토큰이라는

의미있는 문법 단위로 분리하는 것

원시 프로그램: If a ≥ 10 then …

토큰(token) : if, a, ≥, 10, then

토큰번호: 29, 1, 20, 2, 35

3

Page 4: 3장 어휘분석 - 한국방송통신대학교

컴파일러구성 3장 어휘분석

숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)

컴파일러 구조

어휘분석기

구문분석기

중간코드생성기

코드최적화기

목적코드생성기

토큰

중간코드

트리

Source Program

Object Program

Compiler

4

Page 5: 3장 어휘분석 - 한국방송통신대학교

컴파일러구성 3장 어휘분석

숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)

어휘 분석기

소스 프로그램(S.P)을 문법적으로 의미있는 최소 단위로 분할

원시 프로그램 어휘분석기

일련의 토큰

5

Page 6: 3장 어휘분석 - 한국방송통신대학교

컴파일러구성 3장 어휘분석

숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)

토큰의 종류

(1) 식별자(identifier)

(2) 상수(constant)

(3) 예약어(reserved word)

(4) 연산자(operator)

(5) 구분자(delimiter)

어휘분석기 설계

6

Page 7: 3장 어휘분석 - 한국방송통신대학교

컴파일러구성 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

Page 8: 3장 어휘분석 - 한국방송통신대학교

컴파일러구성 3장 어휘분석

숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)

1

2

32

예약어표 검 색 3

4

not found

found

식별자

예약어

33 숫자

not d

b

l

d

d

l d

not l d

8

Page 9: 3장 어휘분석 - 한국방송통신대학교

컴파일러구성 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

Page 10: 3장 어휘분석 - 한국방송통신대학교

컴파일러구성 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

Page 11: 3장 어휘분석 - 한국방송통신대학교

컴파일러구성 3장 어휘분석

숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)

어휘 분석기 구현 방법

프로그래밍 언어를 이용하여 직접 구현

컴파일러 자동화 도구를 이용하여 구현

어휘분석기 생성기 종류 LEX

FLEX

ScanGen

PCLEX

POISON

JLEX

11

Page 12: 3장 어휘분석 - 한국방송통신대학교

컴파일러구성 3장 어휘분석

숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)

컴파일러 생성기 모델

Executable form on M

Language Description : L

컴파일러 컴파일러 생성기 Machine

Description : M

Program written in L

12

Page 13: 3장 어휘분석 - 한국방송통신대학교

컴파일러구성 3장 어휘분석

숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)

어휘 분석기 생성기

LEX: 1975년에 M.E.Leak 가 고안

토큰을 구분하는 프로그램 작성도구

토큰구조 (정규표현)

어휘분석기 (Scanner)

LEX

원시프로그램

일련의 토큰

13

Page 14: 3장 어휘분석 - 한국방송통신대학교

컴파일러구성 3장 어휘분석

숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)

상태전이표를 갖는 어휘분석기

LEX

일련의 토큰들

원시 프로그램

LEX 의 입력

LEX 의 역할

PCLEX 소개

14

Page 15: 3장 어휘분석 - 한국방송통신대학교

컴파일러구성 3장 어휘분석

숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)

LEX의 기능

(lex.yy.c)

LEX

어휘분석용 소스프로그램

정규표현(*.L)

원시프로그램 일련의 토큰

컴파일

어휘분석기

15

Page 16: 3장 어휘분석 - 한국방송통신대학교

컴파일러구성 3장 어휘분석

숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)

LEX 입력 명세서

사용형식

{정의부분}

%% //규칙시작표시, 생략 불가능

{규칙부분} //규칙부분::= 정규표현 + 수행코드

%%

{사용자 부프로그램} 16

Page 17: 3장 어휘분석 - 한국방송통신대학교

컴파일러구성 3장 어휘분석

숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)

LEX 정규표현

::=텍스트 문자 + 연산자 문자

텍스트 문자 비교대상의 스트링문자로 알파벳과 숫자

연산자 문자 “ \ [] ^ - ? . * + () $ / {} % <>

17

Page 18: 3장 어휘분석 - 한국방송통신대학교

컴파일러구성 3장 어휘분석

숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)

LEX 수행코드

정규표현이 매칭되면 즉, 토큰이 인식되었을 때 실행해야 할 행동을 C언어로 기술하는 부분

수행코드 구성

전역변수

함수

I/O 루틴(입출력함수)

18

Page 19: 3장 어휘분석 - 한국방송통신대학교

컴파일러구성 3장 어휘분석

숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)

LEX 수행코드

전역변수

yytext 정규표현과 매칭된 실제 문자열 보관 변수 [a-z]+ printf(“%s”, yytext);

yyleng 매칭된 문자열의 길이를 저장하는 변수

yytext[yyleng-1]

매칭된 스트링의 마지막 문자

19

Page 20: 3장 어휘분석 - 한국방송통신대학교

컴파일러구성 3장 어휘분석

숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)

LEX 수행코드

함수

yylex() LEX 입력에서 명시한 정규표현과 일치하는 토큰을 찾을 때까지 한 문자씩 계속 읽음

yymore() 현재 매칭된 문자열의 끝에 다음에 인식될 문자열을 덧붙이는 함수

20

Page 21: 3장 어휘분석 - 한국방송통신대학교

컴파일러구성 3장 어휘분석

숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)

LEX 수행코드

함수

yyless(n) n개의 문자만을 yytext에 남겨두고 나머지는 다시 처리하기 위해 input으로 되돌려 보내는 함수.

yywrap() Lex가 입력의 끝을 만났을때 호출하는 함수.

정상인 경우 : 함수 복귀값은 1

21

Page 22: 3장 어휘분석 - 한국방송통신대학교

컴파일러구성 3장 어휘분석

숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)

LEX 수행코드

I/O 루틴

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

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

unput(c) input()에 의해 읽혀지도록 문자 c를 입력 스트림으로 되돌려보내는 함수

22

Page 23: 3장 어휘분석 - 한국방송통신대학교

컴파일러구성 3장 어휘분석

숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)

LEX 활용 사례

원시프로그램(datafile)

토큰 LIST(10 개)

ABC := E * 314 + ABC / E ;

ABC, :=, E, *, 314, +, ABC, /, E, ;

23

Page 24: 3장 어휘분석 - 한국방송통신대학교

컴파일러구성 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

Page 25: 3장 어휘분석 - 한국방송통신대학교

컴파일러구성 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

Page 26: 3장 어휘분석 - 한국방송통신대학교

컴파일러구성 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

Page 27: 3장 어휘분석 - 한국방송통신대학교

컴파일러구성 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

Page 28: 3장 어휘분석 - 한국방송통신대학교

컴파일러구성 3장 어휘분석

숭실대학교 HCI&지능형로봇 연구소 교수 김명진(공학박사)

LEX 실행 결과

ABC := E * 314 + ABC / E ; datafile

Start of LEX Identifier : ABC Assign_op Identifier : E MUL_op Number : 314 Add_op Identifier : ABC DIV_op Identifier : E Semicolon End of LEX

실행결과

토큰 10개