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

컴파일러구성 - [제9강] LR 구문분석

by boolean 2016. 7. 18.
728x90

컴파일러구성 - [제9강] LR 구문분석

증가문법 ·closure와 GOTO 함수 ·SLR 파싱표 와 구문분석


컴파일러 용어정리

  • LR(k) 문법
    모든 엔트리(entry)에 대해, 유일하게 정의되는 파싱표를 만들 수 있는 문법을 말한다. 여기서 k를 lookahead의 길이라고 하며, 이는 handle을 결정하는 데 k개의 입력기호에 이르기까지 조사하는 것
  • LR(0) 항목
    생성규칙의 오른쪽에 점기호(dot symbol)를 가진 생성규칙
  • 증가문법
    G=(VN,VT,P,S)에서 G에 첨가된 문법
    즉, 시작기호 {S'→S} 를 하나 더 추가한 문법이다..
  • Closure
    마크기호가 [A→ α․Bβ]와 같이 논터미널인 경우에 이 논터미널 B를 생성규칙의 왼쪽으로 갖는 LR(0) 항목을 구하는 것을 closure라고 한다. 이 closure는 반복적으로 계속 적용된다.
  • GOTO 함수
    GOTO(I, X) = closure({[A → αX․β]| [A → α․Xβ∈I})
    즉, 현재 마킹한 상태에서 구문분석을 하기 위해, 마크기호를 하나씩 읽는 것을 의미한다.
  • Canonical collection
    LR(0) 항목 집합의 canonical collection은 C0로 표기하며
    C0 = {closure ([S'→ ․ S]) ∪ {GOTO (I, X)| I ∈ C0, X∈V} 이다. 즉, closure ([S'→ ․ S])를 구한 후 반복해서 GOTO (I, X)를 적용한 것들의 집합이다. 

요약정리

  1. 순위 구문분석에서는 handle을 찾기 위해서 여러 가지 제약조건들을 주었으나, 이런 제약조건들 때문에 일반적인 프로그래밍 언어의 구문구조를 표현하기에는 적당하지 못한 단점이 있었다. LR(Left to right scanning and Right parse) 구문분석은 일반적인 프로그래밍 언어의 구문구조를 표현하고 구문분석을 하기 위해서 나온 방법이다.
  2. LR 파싱표를 구성하는 방법은 3가지가 있다. 첫째, LR(0) 항목의 집합과 FOLLOW로부터 파싱표를 만드는 Simple LR(SLR) 방법, 둘째, LR(1) 항목의 집합으로부터 파싱표를 만드는 방법인 Canonical LR(CLR) 방법, 셋째, LR(0) 항목의 집합과 lookahead로부터 또는 LR(1) 항목의 집합으로부터 구성하는 방법인 LookAhead LR(LALR) 방법 등이다.
  3. 증가문법(augmented grammar)이란 G=(VN,VT,P,S)에서 G에 첨가된 문법으로 G'=(VN∪{S'},VT ,P∪{S' → S},S')를 뜻한다. 여기서 생성규칙 S' → S을 첨가하는 이유는 구문분석시 주어진 문장에 accept 되는 것을 S' → S로 reduce되는 경우로 취하기 위한 것이다.
  4. 마크기호가 [A→ α․Bβ]와 같이 논터미널인 경우에 이 논터미널 B 를 생성규칙의 왼쪽으로 갖는 LR(0) 항목을 구하는 것을 closure라고 한다. 이 closure는 반복적으로 계속 적용된다. 이 closure는 반복적으로 계속 적용된다. 즉, 한 상태에서 valid한 모든 LR(0) 항목을 구하는 것이다.
  5. SLR 구문분석은 LR 구문분석 방법 중 가장 간단하게 구현될 수 있는 방법으로서, SLR의 파싱표를 만드는 방법은 LR(0) 항목의 집합과 FOLLOW를 이용한다. SLR 파싱표는 shift와 GOTO 행동은 LR(0) 항목의 canonical collection으로부터 구해지고, reduce는 생성규칙의 논터미널 기호의 FOLLOW를 보고 결정한다. 

연습문제

  • 연습문제1
    다음은 LR(0) 항목 집합의 canonical collection을 구하는 과정이다. GOTO(I0, E) 를 보기에서 고르시오.
    1. canonical collection
    I0 : closure ([S' → ·E]) ={[S' → ·E], [E → ·E+T], [E → ·T], [T → ·T*F], [T → ·F], [F → ·(E)],
    [F → ·id]}
    I1 = GOTO (I0, E)
    I2 = GOTO (I0, T)
    I3 = GOTO (I0, F)
    :
    I7 = GOTO (I2, * )

    [보기]
    (가) [T → F·]
    (나) [E → T·], [T → T·*F]
    (다) [S' → E·], [E → E·+T]
    (라) [T→ T*․F],[F→ ․(E)], [F→ ․id]
    답을 체크하세요
    정답 :
    I0 ={[S' → ·E], [E → ·E+T], [E → ·T],
                 [T → ·T*F], [T → ·F], [F → ·(E)], [F → ·id]}
    에서 ·E를 포함하고 있는 것은 [S' → ·E], [E → ·E+T] 이다.
    따라서
         I1 = GOTO (I0, E) = closure{[S'→ E․], [E → ·E+T]}
                            = {[S'→ E․], [E → E․+T]}
    보기 (다)가 된다.
  • 연습문제2
    다음은 LR(0) 항목 집합의 canonical collection을 구하는 과정이다. GOTO(I0, T) 를 보기에서 고르시오.
    I0 : closure ([S' → ·E])
     ={[S' → ·E], [E → ·E+T], [E → ·T],
      [T → ·T*F], [T → ·F], [F → ·(E)], [F → ·id]}

    [보기]
    (가) [F → id·]
    (나) [T → F·]
    (다) [E → T·], [T → T·*F]
    (라) [S' → E·], [E → E·+T]
    답을 체크하세요
    정답 :
    GOTO (I0, T) =closure{[E → ·T],[T → ·T*F]}={[E → T·], [T → T·*F]}
  • 연습문제3
    다음은 SLR 구문분석을 위해 LR(0) 항목 집합의 canonical collection을 구하는 과정이다. 다음 중 GOTO (I0, F) 항목은?
    I0 : closure ([S' → ·E]) ={[S' → ·E], [E → ·E+T],        [E → ·T], [T → ·T*F], [T → ·F], [F → ·(E)],
           [F → ·id]}
    답을 체크하세요
    정답 :
    I0 에서 F 앞에 ․이 있는 것을 고르면 된다.
    closure ([T → F·]) = { [T→ F ․] }
  • 연습문제4
    파싱표를 이용하여 문장 id+id 을 구문분석하는 과정이다. 빈칸 (가)의 내용은?
    < 파 싱 표 >
    상태구문분석기의 행동GOTO 함수
    id+*()$ETF
    0S5  S4  123
    1 S6   acc   
    2 r2S7 r2r2   
    3 r4r4 r4r4   
    4S5  S4  823
    5 r6r6 r6r6   
    6S5  S4   93
    7S5  S4    10
    8 S6  S11    
    9 r1S7 r1r1   
    10 r3r3 r3r3   
    11 r5r5 r5r5   


    단계스택입력기호구문분석 내용
    00id+id$shift 5
    10id5+id$reduce 6
    20F+id$(   가   )
    30F3+id$reduce 4
    40T+id$goto2
    0T2+id$ 
    답을 체크하세요
    정답 :
    상태가 0 이고 입력기호가 F 인 곳을 파싱표에서 찾아보면 3 이다. 
  • 연습문제5
    다음은 GOTO 그래프를 이용하여 SLR 파싱표를 구하는 과정이다.‘가’에 알맞은 내용은?




    < SLR 파 싱 표 >
    상태구문분석기의 행동GOTO 함수
    id+*()$ETF
    0‘가’  S4  1  
    1         
    크게보기
    답을 체크하세요
    정답 :
    GOTO 그래프에서 I0 는 id 에 의해서 만나는 곳을 보면 I5 이다. 따라서 shift 5 이다.


댓글