mojo's Blog

CLR Parse / LALR Parse 본문

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

CLR Parse / LALR Parse

_mojo_ 2021. 11. 5. 18:12

Canonical Collection of LR(1) item sets

 

 

[알고리즘] Canonical Collection of LR(1) item sets

입력 : Augmented Grammar G'

출력 : Canonical Collection of LR(1) item sets

 

 

function CLOSURE(I);
begin 
  repeat
    for each item [A → α•Bβ, a]∈I, each production rule B → 𝛄 ∈ G’
      first(βa)에 포함되는 each terminal b에 대해서
      do I = I U {[B → •𝛄, b]}
    end for
  until 더 이상 I에 새로운 item이 추가되지 않을 때
end

function GOTO(I, X);
begin
  [A → α•Xβ, a]∈I 에 대해서 [A → αX•β, a] item set을 J라 하면
  return CLOSURE(J)
end

Procedure items(G’);
begin
  C = {CLOSURE({S’ → •S})};
  repeat
    for
      Each I∈C, symbol X에 대해 GOTO(I,X)가 non-empty이고 C에 포함되지 않으면
      do C = C U GOTO(I,X)
    end for
  until 더 이상 C에 새로운 item set I가 추가되지 않을 때
end

 

 

CLR Parse Table

 

 

[알고리즘] CLR 파싱표 구성

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

- [출력] Augmented grammar G’에 대한 CLR parse table

- [방법]

 

1. G’에 대한 LR(1) item의 canonical collection C1 = {I0 , I1 , … In }을 구성한다.

 

2. State i는 I i에서 구성되고, state i를 위한 parsing action은 다음과 같다.

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

- 만약 LR(1) item [A → α•, a]∈I i 이면 action 표의 M[i, a] = Reduce A → α

- 만약 LR(1) item [S’ → S•, $]∈I i 이면 action 표의 M[i, $] = Accept

 

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

 

4. Augmented production rule의 LR(1) item [S’ → •S, $]를 포함하는 state는 initial state.

 

 

Example ) 다음 문법에서 LR(1) item의 Canonical collection을 구해보자.

 

S → CC

C → cC

C → d 

 

1. Augmented grammar 을 추가한다.

 

S' → S

S → CC

C → cC

C → d 

 

2. CLOSURE 를 구한다.

 

CLOSURE([S' → S, $]) = {[S' → S, $], [S → CC, $], [C → •cC, c/d], [C → •d, c/d]} = I0

 

3. GOTO 를 구한다.

 

GOTO(I0, S) = CLOSURE([S' → S, $])

                    = {[S' → S, $]} = I1

GOTO(I0, C) = CLOSURE([S → C•C, $])

                    = {[S → C•C, $], [C → •cC, $], [C → •d, $]} = I2

GOTO(I0, c) = CLOSURE([C → c•C, c/d])

                   = {[C → c•C, c/d], [C → •cC, c/d], [C → •d, c/d]} = I3

GOTO(I0, d) = CLOSURE([C → d, c/d])

                    = {[C → d, c/d]} = I4

 

I1 는 GOTO 를 할 수 없다.

 

GOTO(I2, C) = CLOSURE([S → CC, $])

                     = {[S → CC, $]} = I5

GOTO(I2, c) = CLOSURE([C → c•C, $])

                   = {[C → c•C, $], [C → •cC, $], [C → •d, $]} = I6

GOTO(I2, d) =  CLOSURE([C → d, $])

                    = {[C → d, $]} = I7

 

GOTO(I3, C) = CLOSURE([C → cC, c/d])

                    = {[C → cC, c/d]} = I8        

GOTO(I3, c) = CLOSURE([C → c•C, c/d])

                    = {[C → c•C, c/d], [C → •cC, c/d], [C → •d, c/d]} = I3 

GOTO(I3, d) = CLOSURE([C → d, c/d])

                    = {[C → d•, c/d]} = I4

              

I4 는 GOTO 를 할 수 없다.

 

I5 는 GOTO 를 할 수 없다.

 

GOTO(I6, C) = {[C → cC, $]} = I9

GOTO(I6, c) = {[C → c•C, $], [C → •cC, $], [C → •d, $]} = I6

GOTO(I6, d) = {[C → d•, $]} = I7

 

I7 는 GOTO 를 할 수 없다.

 

I8 는 GOTO 를 할 수 없다.

 

I9 는 GOTO 를 할 수 없다.

 

 

 

 

 

 

앞서 만든 Canonical collection 을 활용하여 CLR parsing table 을 구성해보자.

 

 

State Action GOTO
c d $ S C
0 s3 s4   1 2
1     accept    
2 s6 s7     5
3 s3 s4     8
4 r3 r3      
5     r1    
6 s6 s7     9
7     r3    
8 r2 r2      
9     r2    

 

 

parsing table 을 활용하여 Sentence = "ccdd" 를 parsing 해보자

 

Step Stack Input buffer parsing
0 0 ccdd$ s3
1 0c3 cdd$ s3
2 0c3c3 dd$ s4
3 0c3c3d4 d$ r3
4 0c3c3C d$ GOTO(3, C) = 8
5 0c3c3C8 d$ r2
6 0c3C d$ GOTO(3, C) = 8
7 0c3C8 d$ r2
8 0C d$ GOTO(0, C) = 2
9 0C2 d$ s7
10 0C2d7 $ r3
11 0C2C $ GOTO(2, C) = 5
12 0C2C5 $ r1
13 0S $ GOTO(0, S) = 1
14 0S1 $ accept!

 

 

Example ) 다음 문법에서 LR(1) item의 Canonical collection 을 구해보자.

 

① S → L = R

② S → R

③ L → *R

④ L → id

⑤ R → L

 

 

(1) Augmented Grammar 을 추가하자

 

S' → S

S → L = R

S → R

L → *R

L → id

R → L

 

(2) CLOSURE 를 구하자

 

CLOSURE([S' S, $]) = {[S' S, $], [S → •L = R, $], [S → •R, $],

                                       [L → •* R, = / $], [L → •id, = / $], [R → •L, $]} = I0

 

(3) GOTO 를 구하자 (생략)

 

...

 

 

 


 

LALR Parser

 

 

 

CLR parsing

- SLR 방법보다 강력하다는 장점

- lookahead를 구하는 과정이 복잡하고 시간이 오래 걸리며 parse table이 크다는 단점

 

LALR parsing

- LR(1)과 같이 reduce action에서는 lookahead를 이용

- Parsing table의 크기를 되도록 작게 구성

 

Strengths

- SLR 방법보다 강력

- parse table의 크기가 CLR 방법보다 작음

- 프로그래밍 언어의 구문 구조를 대부분 편리하게 표현할 수 있음

    (1) 모호하지 않은 문맥자유 문법으로 표현된 거의 모든 언어를 인식

    (2) 에러를 초기에 탐지 가능

 

Weaknesses

- parse table을 만들기 위해 lookahead 기호를 구하는 것이 어려움

 

 

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

Semantic Analysis  (0) 2021.11.20
LALR Parsing  (0) 2021.11.12
SLR Parsing / CLR Parser  (0) 2021.11.04
Canonical Collection  (0) 2021.10.30
Bottom-up Parsing  (0) 2021.10.27
Comments