본문 바로가기
컴퓨터과학[3-2]/컴파일러

컴파일러구성 - [제10강] CLR 구문분석

by boolean 2016. 7. 18.
728x90

컴파일러구성 - [제10강] CLR 구문분석

SLR 충돌문제와 lookahead ·closure와 GOTO 함수 ·CLR 파싱표와 구문분석

컴파일러 용어정리

  • LR
    Left to right scanning and Right parse
  • SLR 구문분석
    Simple LR 구문분석은 LR 구문분석 방법 중 가장 간단하게 구현될 수 있는 방법이다. SLR 파싱표를 만드는 방법은 LR(0) 항목의 집합과 FOLLOW를 이용한다.
  • CLR 구문분석
    Canonical LR 구문분석은 SLR 의 충돌문제를 해결한 구문분석 방법이다. lookahead를 이용하는 방법인데, lookahead를 구해야 하므로 과정이 복잡하고 시간이 오래 걸리며 파싱표가 커진다.
  • LR(1)
    LR(0)항목에서 lookahead 정보를 첨가한 것.
    LR(1) 항목은 [A → α․β, a]형태를 가지며
    여기서 A → αβ ∈ P이고 a ∈ VT ∪ {$} 이다.
    A → α․β를 core라 부르며 LR(0) 항목과 같은 의미이다.
  • lookahead
    LR(1) 항목 [A → α․β, a]에서 a를 항목의 lookahead라 부르며, reduce 항목 일 때 그 기호에 대해서 reduce 행동을 하는 것을 뜻한다. 

요점정리

  1. 한 상태에서 어떤 논터미널 기호 다음에 나올 수 있는 터미널 기호들을 lookahead라 부르는데 이를 이용하려고 하는 것이 바로 CLR 방법이다.
  2. LR(0) 항목에서 lookahead 정보를 첨가한 것이 LR(1) 항목이며 [A → α․β, a] 형태를 가지며 여기서 A → αβ ∈ P이고 a ∈ VT ∪ {$} 이다. 첫 번째 부분 A → α․β를 core라 부르며 LR(0) 항목과 같은 의미이다. 두 번째 부분 a를 항목의 lookahead라 부르며, reduce 항목 일 때 그 기호에 대해서 reduce 행동을 하는 것을 뜻한다.
  3. CLR 파싱표를 구성하기 위해서는 LR(1) 항목 집합의 canonical collection을 구해야 하는데, 이것 역시 closure 함수와 GOTO 함수가 필요하다. GOTO 함수는 LR(0) 항목 집합의 canonical collection을 구할 때와 같으며 closure 함수는 lookahead 정보 때문에 약간 수정해야 한다.
  4. CLR방법은 한 상태에서 어떤 논터미널 기호 다음에 나올 수 있는 터미널 기호인 lookahead를 이용하는 방법인데, lookahead를 구해야 하므로 과정이 복잡하고 시간이 오래 걸리며 파싱표가 커지는 단점이 있다.
  • 연습문제1
    다음은 CLR 그래프를 이용하여 파싱표를 구성하고 구문분석을 하는 과정이다.
    빈칸 ‘가’에 알맞은 것은?


    < CLR 파싱표 >
    상태구문분석기의 행동GOTO 함수
    cd$SC
    0S3(가) 12
    1  acc  
    2S6S7  5
    3S3S4  8
    4r3r3   
    5  r1  
    6S6S7  9
    7  r3  
    8r2r2   
    9  r2  
    크게보기
    답을 체크하세요
    정답 :
    CLR 그래프에서 터미널기호에 의해서 전이되는 것은 shift
    논터미널 기호에 의해서 전이되는 것은 goto 로 파싱표를 구성하면 된다.
    항목집합0 에서 터미널 기호 d를 따라가 보면 4번 항목집합이 나온다.
    따라서 shift 4 가 된다. 
  • 연습문제2
    다음은 LR(1) 항목 집합의 canonical collection 들이다. 보기에서 I0 는?
    (1) 증가문법
                0) S' → S
                1) S → CC
                2) C → cC
                3) C → d
    (2) Canonical Collection.
                I0 = closure ([S' → ·S, $])
                I1 = GOTO (I0, S)
                I2 = GOTO (I0, C)

    [보기]   (가) [S' → ·S, $], [S → ·CC, $],
                     [C → ·cC, c/d],[C → ·d, c/d]
              (나) [S → C·C, $], [C → ·cC, $],
                     [C → ·d, $]
             (다) [S' → S·, $]
             (라) [C → d·, c/d]
    답을 체크하세요
    정답 :
    I0 = closure ([S' → ·S, $])
       = {[S' → ·S, $], [S → ·CC, $], [C → ·cC, c/d],
         [C → ·d, c/d] }
  • 연습문제3
    다음은 CLR 파싱표를 이용하여 구문분석하는 과정이다. 빈칸 ‘가’에 알맞은 것은?
    상태구문분석기의 행동GOTO 함수
    cd$SC
    0S3S4 12
    1  acc  
    2S6S7  5
    3S3S4  8
    4r3r3   
    5  r1  
    6S6S7  9
    7  r3  
    8r2r2   
    9  r2  


    문장 cdcd에 대한 구문분석의 일부이다.

    단계스택입력기호구문분석 내용
    00cdcd$shift 3
    10c3dcd$shift 4
    20c3d4cd$reduce3
    30c3Ccd$goto 8
    40c3C8cd$reduce 2
    50Ccd$( ‘가’ )
    60C2cd$shift 6
    70C2c6d$shift 7
    80C2c6d7$reduce 3
    답을 체크하세요
    정답 :
    CLR 파싱표에서 상태=0, 입력기호=C를 찾아보면 goto 2

    단계스택입력기호구문분석 내용
    00cdcd$shift 3
    10c3dcd$shift 4
    20c3d4cd$reduce3
    30c3Ccd$goto 8
    40c3C8cd$reduce 2
    50Ccd$goto 2
    60C2cd$shift 6
    70C2c6d$shift 7
    80C2c6d7$reduce 3
  • 연습문제4
    다음은 CLR 그래프를 이용하여 파싱표를 구성하는 과정이다. 빈칸 ‘가’에 알맞은 것은?



    < CLR 파싱표 >
    상태구문분석기의 행동GOTO 함수
    cd$SC
    0S3S4 12
    1  acc  
    2S6S7  5
    3S3S4  8
    4r3r3   
    5  r1  
    6S6S7  9
    7  (가)  
    8r2r2   
    9  r2  
    크게보기
    답을 체크하세요
    정답 :
    I7은 $에 의해서 도달하는 곳은 [C → ·d, $] 즉, reduce 항목이다. 문법규칙은 3번 규칙이므로 r3 이 된다. 
  • 연습문제5
    다음은 GOTO 그래프를 이용하여 SLR 파싱표를 구하는 과정이다.‘가’에 알맞은 내용은?


    < CLR 파싱표 >
    상태구문분석기의 행동GOTO 함수
    cd$SC
    0S3S4 12
    1  (가)  
    2S6S7  5
    3S3S4  8
    4r3r3   
    5  r1  
    6S6S7  9
    7  r3  
    8r2r2   
    9  r2  
    크게보기
    답을 체크하세요
    정답 :
    I1에서 $를 만나면 accept가 된다. 


댓글