8. lr 구문 분석

28
1 8. LR 구구 구구 8-1. LR 파파 8-2. LR(0) 파파파파 파파 8-3. SLR 파파 파파파 파파 파파 8-4. CLR 파파 파파파 파파 파파 8-5. LALR 파파 파파파 파파 파파 8-6. 파파파 파파 8-7. LR 파파 파파파파 파파 8-8. 파파 파파파파 파파

Upload: hoyt-chan

Post on 02-Jan-2016

110 views

Category:

Documents


0 download

DESCRIPTION

8. LR 구문 분석. 8-1. LR 파서 8-2. LR(0) 아이템의 집합 8-3. SLR 파싱 테이블 구성 방법 8-4. CLR 파싱 테이블 구성 방법 8-5. LALR 파싱 테이블 구성 방법 8-6. 모호한 문법 8-7. LR 파싱 테이블의 구현 8-8. 구문 분석기의 작성. 8-1. LR 파서. LR 구문분석 정의 결정적인 bottom-up 방법으로 LR 는 입력 스트링을 왼쪽에서 오른쪽으로 읽어가며 (Left to right scanner) 출력으로 우파스 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 8. LR  구문 분석

1

8. LR 구문 분석

8-1. LR 파서8-2. LR(0) 아이템의 집합8-3. SLR 파싱 테이블 구성 방법8-4. CLR 파싱 테이블 구성 방법8-5. LALR 파싱 테이블 구성 방법8-6. 모호한 문법8-7. LR 파싱 테이블의 구현8-8. 구문 분석기의 작성

Page 2: 8. LR  구문 분석

2

8-1. LR 파서

• LR 구문분석 정의

– 결정적인 bottom-up 방법으로 LR 는 입력 스트링을 왼쪽에서

오른쪽으로 읽어가며 (Left to right scanner) 출력으로 우파스

(Right parse) 를 생성하기 때문에 붙여진 이름이다 .

Page 3: 8. LR  구문 분석

3

• 정의– LR 방법으로 주어진 스트링을 구문 분석하는 구문 분석기를

말한다 .

Sn

...구문분석기 파싱테이블

a1 a2 … an$

출력

입력

스택

스택 : S0X1S1 … XmSm (Si: 상태 , XiV : 문법기호 )

버퍼 : a1a2…an$

Page 4: 8. LR  구문 분석

4

• Parser

– 정의• (S0X1S1XmSm, aiai+1…an$)

– shift• ACTION[Sm,ai] = shift S ( 다음상태 )

(S0X1S1…XmSmaiS, ai+1…an$)

• 입력심벌을 스택에 넣고 다음 상태를 S 로 만들기 위해 S 도 역시 스택 에 push 한다는 의미

– reduce• ACTION[Sm, ai] = reduce A | | = r 2*r 만큼 pop off

(S0X1…Sm-rAS, ai+1…an$) 새로운 S GoTo(Sn-r,A) = S

Page 5: 8. LR  구문 분석

5

– Accept

• ACTION[Sm, ai] = accept

Sm 상태에서 입력 심벌 ai 를 본 행동이 accept 라면 주어진 스트링이

올바른 스트링이라는 의미이며 파싱을 끝낸다 .

– Error

• ACTION[Sm, ai] = errorSm 상태에서 입력 심벌 ai 를 본 행동이 error 라면 입력 스트링이 틀린

스트링이라는 의미이며 그 에 따른 작업을 하게 된다 . 일반적으로 오류복구 루틴을 불러 오류를 처리한다 .

Page 6: 8. LR  구문 분석

6

예제

1. LISTLIST, ELEMENT2. LISTELEMENT3. ELEMENTa

파싱테이블 :

파싱 과정 :

(0 , a, a$)(0 a 3 , , a$)(0 ELEMENT 2 , , a$)(0 LIST 1 , , a$)(0 LIST 1, 4 , a$)(0 LIST 1, 4 a 3 , $)(0 LIST 1, 4 ELEMENT 5 , $)(0 LIST 1 , $)

심벌상태

a , $ LIST ELEMENT

0 s3 1 21 s4 acc2 r2 r23 r3 r34 s3 55 r1 r1

r3GOTO2

r2GOTO1

s4

r3GOTO5

s3

r1GOTO1

s3

accept

Page 7: 8. LR  구문 분석

7

8-2. LR(0) 아이템의 집합

• 정의– LR(0) 아이템은 생성 규칙의 오른쪽에 점 심벌을 가진 생성

규칙이다 .

예제생성 규칙의 형태가 AXYZ 일 때 , [A.XYZ], [AX.YZ],[AXY.Z], 그리고 [AXYZ.] 등은 모두 LR(0) 아이템이다 .

Page 8: 8. LR  구문 분석

8

8-3. SLR 파싱 테이블 구성 방법

• SLR 이란– Simple LR

– C0 와 FOLLOW 정보를 이용하여 파싱 테이블을 구성하는 방법C0 = { I0, I1, , In }

Page 9: 8. LR  구문 분석

9

• SLR 파싱 테이블을 작성하는 방법

– 만일 LR(0) 아이템 [A.a] 가 상태 I 에 있고 a 가 terminal심벌

이면 shift 행동이므로 , I 상태에서 마크 심벌 a 를 보고 j 상태로 가

는 GOTO 함수가 존재한다면 , ACTION 테이블의 상태 I 와 심벌 a 가 만나는 곳에 상태 번호 j 를 적는다 .

if [A.a]Ii and GOTO(Ii, a) = Ii then

M[i, a]:= shift j

– 아이템 [Aa.] 가 상태 I 에 있다면 , reduce 행동이므로 nonterminal A 의 FOLLOW 를 구하여 ACTION 테이블의 상태 I 와 FOLLOW 심벌이 만나는 곳에 reduce 생성 규칙 번호를 적는다 .

if[A.]Ii then

for each aFOLLOW(A) do M[i,a]:=reduce A

Page 10: 8. LR  구문 분석

10

• 상태 I 에 LR(0) 아이템 [S’S.] 가 있다면 accept 행동이므로 ACTION 테이블의 상태 I 와 $ 심벌이 만나는 곳에 accept 를

적는다 .

if [S’S.]Ii then M[i, $] := accept

• 만일 LR(0) 아이템 [A.B] 가 상태 I 에 있고 B 가 nonterminal

심벌일 때 , 상태 I 에서 마크 심벌 B 를 보고 상태 j 로 가는 GOTO

함수가 존재한다면 GOTO 테이블의 상태 I 와 nonterminal 심벌 B가

만나는 곳에 상태 번호 j 를 적는다 .

if[A.B]Ii and GOTO(Ii, B) = Ii then

M[i, B] := j.

Page 11: 8. LR  구문 분석

11

– 이렇게 해서 정의되지 않은 파싱 테이블의 엔트리는 모두 error 가 되며 첨가된 생성 규칙의 LR(0) 아이템 [S’S] 를 포함하는 상태 가 초기 상태가 된다 .

예제1. E E + T 2. E T3. T T * F 4. T F5. F (E) 6. F id

(1) 첨가된 생성 규칙 : 0. S’ E 1. E E + T 2. E T 3. T T * F 4. T F 5. F (E)

6. F id

Page 12: 8. LR  구문 분석

12

[S’ .E][E.E+T][E.T][T.T*F][T.F][F.(E)[F.id]

[S’E.][EE.+T]

[ET.][TT.*F]

[TF.]

[EE+.T][T.T*F][T.F][F.(E)][F.id]

[EE+T.][TT.*F]

[TT*.F][F.(E)][F.id]

[TT*F.]

[F (.E)[E .E+T][E .T][T .T*F][T .F][F .(E)][F .id]

[Fid.]

[F(E.)][EE.+T] [F(E).

I0

I11I8

I5

I4

I7I3

I2

I9I6I1

I10

E + T

*

+

*

F

((

E)

(

(

idid

id

F

T

T

F

(2) C0 및 GOTO 그래프

Page 13: 8. LR  구문 분석

13

(3) FOLLOW 의 계산 FOLLOW(E) = {$, +, )}

FOLLOW(T) = {*, +, ), $} FOLLOW(F) = {*, +, ), $}

(4) 파싱 테이블

ACTION 테이블 GOTO 테이블상태 id + * ( ) $ E T F0 s5 s4 1 2 31 s6 acc2 r2 s7 r2 r23 r4 r4 r4 r44 s5 s4 8 2 35 r6 r6 r6 r66 s5 s4 9 37 s5 s4 108 s6 s119 r1 s7 r1 r1

10 r3 r3 r3 r311 r5 r5 r5 r5

Page 14: 8. LR  구문 분석

14

(5) 스트링 a*a+a 를 위한 구문 분석 과정단계 스 택 입력 심벌 구문 분석 내용 출력

0 0 a*a+a$ shift 51 0a5 *a+a$ reduce 6 62 0F *a+a$ GOTO 33 0F3 *a+a$ reduce 4 44 0T *a+a$ GOTO 25 0T2 *a+a$ shift 76 0T2*7 a+a$ shift 57 0T2*7a5 +a$ reduce 6 68 0T2*7F +a$ GOTO 109 0T2*7F10 +a$ reduce 3 310 0T +a$ GOTO 211 0T2 +a$ reduce 2 212 0E +a$ GOTO 113 0E1 +a$ shift 614 0E1+6 a$ shift 515 0E1+6a5 $ reduce 6 616 0E1+6F $ GOTO 317 0E1+6F3 $ reduce 4 418 0E1+6T $ GOTO 919 0E1+6T9 $ reduce 1 120 0E $ GOTO 121 0E1 $ accept

Page 15: 8. LR  구문 분석

15

8-4. CLR 파싱 테이블 구성 방법

• 정의

– LR(0) 아이템에 lookahead 정보를 첨가 한 것이 LR(1) 아이템 이라고 한다 .

– LR(1) 아이템은 [A., a] 의 형태를 이루며 여기서 AP 이고 aVT{$} 이다 .

• 첫번째 부분 A. 를 core 라고 부르며 LR(0) 아이템과 같은 의미 를 갖는다 .• 두 번째 부분 a 를 아이템의 lookahead 라 부르며 , reduce 아이템

일 때 그 심벌에 대하여 reduce 행동을 하는 것을 뜻한다 .

Page 16: 8. LR  구문 분석

16

– I 가 LR(1) 아이템의 집합이라면 , CLOSURE(I) = I {[B., b] | [A.B, a]CLOSURE(I),

BP, bFIRST(a)} 이다 .

• CLR 파싱 테이블 작성 방법

– 만일 LR(1) 아이템 [A.a, u] 가 상태 i 에 있고 terminal이면

shift 행동이므로 , i 상태에서 마크 심벌 a 를 보고 j 상태로 가는 GOTO 함수가 존재한다면 ACTION 테이블의 상태 I 와 심벌 a 가 만나는 곳에 상태 번호 j 를 적는다 .

if [A.a, u]Ii and GOTO(Ii, a) = Ij then

M[i, a] := shift j.

Page 17: 8. LR  구문 분석

17

– 만일 LR(1) 아이템 [A., u] 가 상태 I 에 있다면 reduce 행동 이므로 ACTION 테이블의 상태 I 와 lookahead 심벌 u 가 만나는 곳에 reduce 생성 규칙 번호를 적는다 .

if [A., u]Ii then M[i, u] := reduce A.

– 만일 LR(1) 아이템 [S’S.,$] 가 상태 i 에 있다면 accept 행동 이므로 ACTION 테이블의 상태 I 와 $ 심벌이 만나는 곳에 accept

를 적는다 . if [S’S.,$]Ii then M[I, $] := accept.

– 만일 LR(1) 아이템 [A.B, u] 가 상태 I 에 있고 B 가 nonterminal 일 때 , i 상태에서 마크 심벌 B 를 보고 j 상태로 가는 GOTO 함수가 존재한다면 GOTO 테이블의 상태 i 와 심벌 B 가 만나는 곳에 상태 번호 j 를 적는다 .

if [A.B, u]Ii and GOTO(Ii, B)=Ii then M[i,B] := j.

Page 18: 8. LR  구문 분석

18

8-5. LALR 파싱 테이블 구성 방법

• 정의

– LookAhead LR 방법으로 아이템의 lookahead 정보를 이용하기 때문에 SLR 방법보고 훨씬 강력하고 파싱 테이블의 크기는 CLR 에서 core 가 같은 아이템들을 한 데 묶음으로써 SLR 와 같은 크기 로 구성가능

– 모호하지 않은 context-free 문법으로 표현된 거의 모든 언어를 인식할 수 있기 때문에 요사이 대부분의 파서 제작 시스템에서 사용된다 .

Page 19: 8. LR  구문 분석

19

• 테이블 작성방법

– C1 에서 작성하는 방법• 같은 core 를 가진 LR(1) 아이템 집합들을 한 개의 LR(0) 아이템 집합 으로 만들고 각 아이템의 lookahead 는 이들 LR(1) 아이템의 lookahead 의 합집합으로 구성하는 방법

• 예를 들면 C1 의 Ii 와 Ij 와 같은 core 를 갖고 있다면 , Iij 상태로 통합되어

한 개의 상태로 된다 . 이때 , lookahead 는 두 아이템이 갖고 있는 lookahead 의 합집합이 된다 .

[A.,a]…

[A.,b]…

[A.,a/b]…

Ii Ij

Iij

Page 20: 8. LR  구문 분석

20

– C1 에서 같은 core 를 갖는 상태들을 모두 통합하면 , C0 과 같은

상태수를 갖게 된다 . 따라서 LALR 파싱 테이블의 크기는 항상 SLR 와 같게 된다 .

– 공통 core 를 갖는 상태를 합침으로써 원래의 상태들에서 존재 하지 않았던 shift-reduce 충돌은 야기할 수 있다 . 다시 말해서 , CLR 방법에서 shift-reduce 충돌이 일어나지 않으면 , LALR 방법 에서도 shift-reduce 충돌이 일어나지 않는다 . 왜냐하면 shift 행동은 core 에 따라 결정되는 것이지 lookahead 에 따라 결정 되는 것이 아니기 때문이다 .

– C1 로부터 구하는 것은 이론적으로 쉽게 설명할 수 있으나 실질

적으로 C1 을 작성하는 데는 lookahead 에 따라 상태수가 매우

커지고 시간이 오래 걸려 실제적인 프로그래밍 언어의 파싱 테이 블 구성하는 방법으로는 사용하지 않는다 .

Page 21: 8. LR  구문 분석

21

– C0 를 이용하는 방법

• SLR 방법과 유사• 주어진 문법의 C0 을 구성• 파싱 테이블의 shift 와 accept 그리고 GOTO 행동은 SLR 와 같고 reduce 행동은 각 reduce 아이템의 lookahead 에 의해 결정된다 . • LALR 방법은 C0 으로부터 reduce 아이템의 lookahead 를 구하는 것이

주된 이론

• 정의

– 상태 p 에서 LR(0) 아이템 [A.] 의 lookahead 는 LA(p, [A.]) 로 표기하며 p 상태에서 A 다음에 나올 수 있는 terminal 의 집합이다 .

LA(p, [A.]) = {a | aFIRST(), S’A , accesses p}.

*

Page 22: 8. LR  구문 분석

22

– 상태 p 의 전 상태 , PRED(p) 의 의미는 다음과 같다 .p,qC0 이고 XV, 그리고 V* 일 때 , GOTO(q, ) = q 이고

GOTO(q, X) = GOTO(GOTO(q,X), ) 이다 .그리고 PRED(p, a) = {q | pGOTO(q, a)} 이다 .

– LR(k) 문법은 고정된 k 에 대하여 두 개의 우측 유도과정이 존재할 때마다 다음을 만족한다 .

• S’ 와• S’ y의 유도 과정이 있을 때• FIRSTk() = FIRSTk(y) 이면• a = , A = B, 그리고 x = y이다 .

**

Page 23: 8. LR  구문 분석

23

8-6. 모호한 문법• 정의

– 모든 모호한 문법은 LR 문법이 될 수 없다 .– 파싱테이블 작성시 항상 shift-reduce 충돌이나 reduce-reduce 충돌을 야기

• 모호한 문법에서 구문 분석 행동의 순위– shift-reduce 충돌인 경우

• reduce 되는 생성 규칙과 입력 심벌의 순위를 비교하여 결정하는데 생성 규칙의 순위가 높으면 reduce 를 , 그렇지 않으면 shift 를 선택하는 것이 일반적이다 .

• 같은 순위인 경우에는 결합 법칙을 이용하는데 좌측 결합을 만족하면 reduce 를 , 우측 결합을 만족하면 shift 를 선택한다 .

Page 24: 8. LR  구문 분석

24

– Reduce-reduce 충돌인 경우

• reduce 되는 생성 규칙들의 순위를 비교하여 어느 생성 규칙을 reduce 할 것인가를 결정하는데 순위가 높은 것을 선택

• 생성 규칙의 순위는 그 생성 규칙 내에 있는 terminal 심벌로 결정할 수 있으며 , 또는 YACC 에서와 같이 특별히 명시하는 방법이 있다 . PGS 의 입력 명세서에서 먼저 기술되는 생성 규칙이 순위가 높도록 정할 수 있다 .

Page 25: 8. LR  구문 분석

25

8-7. LR 파싱 테이블의 구현

• 파싱테이블의 구성

– ACTION 테이블과 GOTO 테이블로 구성– ACTION 테이블

• terminal 심벌에 대해나 구문 분석 행동을 나타낸다– GOTO 테이블

• reduce 시에 nonterminal 에 대한 다음 상태를 나타낸다 .

Page 26: 8. LR  구문 분석

26

• 파싱테이블 구현 시 문제점

– 실제 프로그래밍의 경우에 파싱테이블이 상태수와 문법 심벌의 개수에 따라 방대하게 커져 기억 공간을 매우 많이 차지하여 기억 공간의 낭비가 심하고 또한 테이블을 구하는 데도 상당한 시간과 노력이 소요된다

• ACTION 테이블의 기억공간 축소

– 같은 구문 분석 행동을 갖는 상태의 경우 한 상태만 표시하고 나머지 상태에서는 그 구문 분석 행동을 갖는 상태에 포인터만 갖게 함으로써 중복되는 구문 분석 행동으로 인한 기억 공간의 낭비를 줄일 수 있다 .

– 각 상태에서 terminal 심벌 중 구문 분석 행동이 정의된 것만 표현 하고 나머지는 별도로 한데 묶어 나타내어 기억 공간을 줄이는 방법

Page 27: 8. LR  구문 분석

27

• GOTO 테이블의 기억공간 축소

– 각 nonterminal 에 대한 짝을 만들어 내는 것

– 기억 장소를 줄임으로써 테이블을 참조하는 데 걸리는 시간이 증가

– 파싱테이블을 위한 기억 장소의 배정은 동적 기억 장소를 이용 하는 것이 바람직하다 . 왜냐하면 , 파싱테이블은 단지

구문분석 시에만 필요로 하기 때문에 구문분석이 끝났을 때 시스템에 기 억 장소를 되돌려 줌으로써 주기억 장치를 효율적으로 운영할 수 있다 .

Page 28: 8. LR  구문 분석

28

8-8. 구문 분석기의 작성• 기본구성

– 파싱 테이블과 파싱 테이블을 참조하여 구문분석을 수행하는 실행 루틴으로 구성

– 파싱 테이블은 2차원 배열로 행은 terminal 심벌과 nonterminal 심벌이며 , 열은 상태 번호가 된다 . 구문 분석기의 행동은 행과 열이

만나는 곳에 정의되는데 shift 되는 상태는 양의 정수 값으로 , reduce 되는 생성 규칙 번호는 음의 정수 값으로 나타낸다 . 그리고 accept 는 최대 번호보다 큰 생성 규칙으로 reduce될 때 이며 , error 는 0 으로 표시된다 .