mojo's Blog

Canonical Collection 본문

학교에서 들은거 정리/기초컴파일러구성

Canonical Collection

_mojo_ 2021. 10. 30. 18:28

Canonical collection

 

 

LR(0) item set의 canonical collection C0

- C0 = {CLOSURE ({[S′ →•S])} ∪ {GOTO (I, X) | I ∈ C0, X ∈ V}

 

Example: LR(0) item set의 canonical collection을 구해보자.

 

P:

① E → E + T

② E → T

③ T → T * F

④ T → F

⑤ F → (E)

⑥ F → id 

 

(1) Augmented grammar 를 추가한다.

 

S' -> E

 

(2) CLOSURE 를 구한다.

 

I0 = CLOSURE([S' -> E])

    = {[S' -> E], [E -> E + T], [E -> T], [T -> T * F], [T -> F], [F -> (E)], [F -> id]}

 

(3) GOTO 를 구한다.

 

GOTO(I0, E) = CLOSURE({[S' -> E], [E -> E + T]})

                    = {[S' -> E], [E -> E + T]} = I1

GOTO(I0, T) = CLOSURE({[E -> T•], [T -> T• * F]})

                    = {[E -> T•], [T -> T• * F]} = I2

GOTO(I0, F) = CLOSURE({[T -> F•]})

                    = {[T -> F•]} = I3

GOTO(I0, +) =

GOTO(I0, ( ) = CLOSURE({[F -> (•E)]})

                    = {[F -> (•E)], [E -> E + T], [E -> T], [T -> T * F], [T -> F], [F -> (E)], [F -> id]} = I4

GOTO(I0, id) = CLOSURE({[F -> id•]})

                     = {[F -> id•]} = I5

 

GOTO(I1, +) = CLOSURE({[E -> E + •T]}) 

                    = {[E -> E + •T], [T -> •T * F], [T -> F], [F -> (E)], [F -> id]} = I6

 

GOTO(I2, *) = CLOSURE({[T -> T * •F]}) 

                   = {[T -> T * •F], [F -> (E)], [F -> id]} = I7

 

I3는 GOTO를 할 수 없음.

 

GOTO(I4, E) = CLOSURE({[F -> (E•)], [E -> E• + T]})

                    = {[F -> (E•)], [E -> E• + T]} = I8

GOTO(I4, T) = CLOSURE({[E -> T•], [T -> T• * F]})

                    = {[E -> T•], [T -> T• * F]} = I2

GOTO(I4, F) = CLOSURE({[T -> F•]})

                    = {[T -> F•]} = I3

GOTO(I4, ( ) = CLOSURE({[F -> (•E)]})

                    = {[F -> (•E)], [E -> E + T], [E -> T], [T -> T * F], [T -> F], [F -> (E)], [F -> id]} = I4

GOTO(I4, id) = CLOSURE({[F -> id•]})

                     = {[F -> id•]} = I5

 

I5는 GOTO를 할 수 없음.

 

GOTO(I6, T) = CLOSURE({[E -> E + T•], [T -> T• * F]}

                    = {[E -> E + T•], [T -> T• * F]} = I9

GOTO(I6, F) = CLOSURE({[T -> F•]})

                    = {[T -> F•]} = I3

GOTO(I6, ( ) = CLOSURE({[F -> (•E)]})

                    = {[F -> (•E)], [E -> E + T], [E -> T], [T -> T * F], [T -> F], [F -> (E)], [F -> id]} = I4

GOTO(I6, id) = CLOSURE({[F -> id•]})

                     = {[F -> id•]} = I5

 

GOTO(I7, F) = CLOSURE({[T -> T * F•]})

                   = {[T -> T * F•]} = I10

GOTO(I7, ( ) = CLOSURE({[F -> (•E)]})

                    = {[F -> (•E)], [E -> E + T], [E -> T], [T -> T * F], [T -> F], [F -> (E)], [F -> id]} = I4

GOTO(I7, id) = CLOSURE({[F -> id•]})

                     = {[F -> id•]} = I5

 

GOTO(I8, ) ) = CLOSURE({[F -> (E)•]})

                    = {[F -> (E)•]} = I11

GOTO(I8, +) = CLOSURE({[E -> E + •T]})

                    = {[E -> E + •T], [T -> T * F], [T -> F], [F -> (E)], [F -> id]} = I6

 

GOTO(I9, *) = CLOSURE({[T -> T * •F]})

                    = {[T -> T * •F], [F -> (E)], [F -> id]} = I7

 

I10은 GOTO를 할 수 없음.

 

I11는 GOTO를 할 수 없음.

 

따라서 GOTO전부 구했다.

 

 

SLR parser

 

              

LR(0) item set과 FOLLOW를 이용하여 SLR parsing table를 만든다.

 

- LR(0) item의 canonical collection으로부터 Shift/GOTO action을 구하고,

- Production rule에 있는 nonterminals의 FOLLOW로부터 reduce을 결정한다.

 

[알고리즘] SLR parse table

 

- [입력] Grammar G = (VN, VT, P, S)

- [출력] Augmented grammar G′에 대한 SLR 파싱표

- [방법]

 

1. G′를 위한 LR(0) item set의 canonical collection C0 = {I0, I1, …, In}을 구성한다.

 

2. State i는 Ii 에서 구성된다. 상태 i를 위한 parsing action은 다음과 같이 결정된다.

   - 만약 [A → α•aβ] ∈ Ii , GOTO(Ii , a) = Ij 이면 action 표의 M[i, a] = Shift j

   - 만약 [A → α•] ∈ Ii 이면 FOLLOW(A)에 속한 모든 기호 a에 대해 action 표의

      M[i, a] = Reduce A → α       

   - 만약 [S′ → S•] ∈ Ii 이면 action 표의 M[i, $] = Accept

 

3. 만약 [A → α•Bβ] ∈ Ii 이고 GOTO(Ii , B) = Ij 이면 GOTO 표의 M[i, B] = j

 

4. 첨가된 생성 규칙의 LR(0) 항목 [S′ →•S]를 포함하는 state가 initial state이다.

 

5. 이렇게 해서 정의되지 않은 parse table의 entry는 모두 에러가 된다.

 

 

SLR parser implementation

 

 

1. Grammar G가 주어진다.

 

2. Augmented grammar G’를 만든다.

 

3. LR(0) item sets의 canonical collection C0를 구한다.

 

4. Reduce action을 결정하기 위해 FOLLOW를 계산한다.

 

5. SLR parsing table을 작성한다.

 

 

Example ) SLR parsing table 을 만들어보자.

 

P:

① E → E + T

② E → T

③ T → T * F

④ T → F

⑤ F → (E)

⑥ F → id 

 

위에서 만든 GOTO 를 이용하여 I0 ~ I11 에 대한 그래프를 만든다.

 

 

 

FOLLOW(E) = {$, +, )}

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

FOLLOW(*, +, ), $}

 

FOLLOW를 참고하여 SLR parsing table을 채우도록 하자.

 

 

State Action GOTO
id + * ( ) $ E T F
0 s5     s4     1 2 3
1   s6       Accept      
2   r2 s7   r2 r2      
3   r4 r4   r4 r4      
4 s5     s4     8 2 3
5   r6 r6   r6 r6      
6 s5     s4       9 3
7 s5     s4         10
8   s6     s11        
9   r1 s7   r1 r1      
10   r3 r3   r3 r3      
11   r5 r5   r5 r5      

 

 

LR parsing algorithm

 

 

LR parsing algorithm

- [입력] Input string w와 LR parse table

- [출력] 만약 w가 문법에 맞으면 w에 대한 파 스 트리를 생성하고, 그렇지 않으면 에러

 

Parser는 스택의 초기 상태인 S0을 가지고 있다. 
begin
    ip는 w$의 처음 기호를 나타낸다. 
    repeat 
        s 는 stack의 톱 상태
        a 는 ip에 의해 지적된 기호; 
        if action [s, a] = shift sʹ 
        then begin 
            a를 스택에 삽입하고 그 다음에 sʹ를 스택에 삽입한다. 
            ip 가 다음 입력 기호로 이동한다. 
        end 
        else 
            if action [s, a] = reduce sʹ(생성 A → β) 
            then begin 
                |β|개의 기호를 스택에서 삭제한다. 
                삭제된 후 스택의 top이 가리키는 state p에 대하여 GOTO[p, A] = n 을 찾는다.
                A를 스택에 삽입한다. 
                n을 스택에 삽입한다. 
            end 
            else 
                if action [s, a] = 수락
                then return 
                else 에러
    until (ip = $이고 스택의 톱 = $) 
end.

 

 

ex ) Sentence : id * (id * id) 에 대한 LR Parsing을 구하기

 

P:

① E → E + T

② E → T

③ T → T * F

④ T → F

⑤ F → (E)

⑥ F → id 

 

 

 

Step Stack Input string Action
0 0 id*(id*id)$ s5
1 0id5 *(id*id)$ r6
2 0F *(id*id)$ GOTO 3
3 0F3 *(id*id)$ r4
4 0T *(id*id)$ GOTO 2
5 0T2 *(id*id)$ s7
6 0T2*7 (id*id)$ s4
7 0T2*7(4 id*id)$ s5
8 0T2*7(4id5 *id)$ r6
9 0T2*7(4F *id)$ GOTO 3
10 0T2*7(4F3 *id)$ r4
11 0T2*7(4T *id)$ GOTO 2
12 0T2*7(4T2 *id)$ s7
13 0T2*7(4T2*7 id)$ s5
14 0T2*7(4T2*7id5 )$ r6
15 0T2*7(4T2*7F )$ GOTO 10
16 0T2*7(4T2*7F10 )$ r3
17 0T2*7(4T )$ GOTO 2
18 0T2*7(4T2 )$ r2
19 0T2*7(4E )$ GOTO 8
20 0T2*7(4E8 )$ s11
21 0T2*7(4E8)11 $ r5
22 0T2*7F $ GOTO 10
23 0T2*7F10 $ r3
24 0T $ GOTO 2
25 0T2 $ r2
26 0E $ GOTO 1
27 0E1 $ Accept

'학교에서 들은거 정리 > 기초컴파일러구성' 카테고리의 다른 글

Semantic Analysis  (0) 2021.11.20
LALR Parsing  (0) 2021.11.12
CLR Parse / LALR Parse  (0) 2021.11.05
SLR Parsing / CLR Parser  (0) 2021.11.04
Bottom-up Parsing  (0) 2021.10.27
Comments