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

컴파일러구성 - [제11강] LALR 구문분석

by boolean 2016. 7. 18.
728x90

컴파일러구성 - [제11강] LALR 구문분석

·CLR 파싱표의 효율화 ·LR(0)에서 LALR파싱표 구성

컴파일러 용어정리

  • LALR
    LookAhead LR 방법으로 lookahead 정보를 이용하기 때문에 SLR 방법보다 훨씬 강력하고 파싱표의 크기는 CLR에서 core가 같은 항목들을 한데 묶음으로써 SLR과 같은 크기로 구성할 수 있다. 그러나 LR(0) 항목의 집합을 구한 후 파싱표를 만들기 위해 reduce 항목이 있는 각 상태에서 lookahead 기호를 구하는 데 상당한 시간과 노력이 소요된다.
  • LR(0) 항목
    LR(0) 항목은 다음과 같이 3종류로 나누어진다.
       1) [A → α․β]에서 α≠ε 인 kernel 항목
       2) [A → ․α]와 같은 closure 항목
       3) [A → α․]와 같은 reduce 항목
  • 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 행동을 하는 것을 뜻한다. 
  • LA(P, [A → α․β])
    P상태에서 A다음에 나올 수 있는 터미널의 집합인데, 그것은 P상태에서 거꾸로 α 만큼 올라간 상태에서 A다음에 나올 수 있는 터미널들과 같다.

요얌정리

  1. LALR은 LookAhead LR 방법으로 lookahead 정보를 이용하기 때문에 SLR 방법보다 훨씬 강력하고, 파싱표의 크기는 CLR에서 core가 같은 항목들을 한데 묶음으로써 SLR과 같은 크기로 구성할 수 있다. 또한, 모호하지 않은 context-free 문법으로 표현된 거의 모든 언어를 인식할 수 있으며, 오류를 초기에 탐지할 수 있다.
  2. LALR 파싱표는 LR(1)에서 유도하는 방법과 LR(0)에서 유도하는 방법이 있다.
  3. 먼저 LR(1)에서 유도하는 방법은 같은 core를 가진 LR(1) 항목 중에서 LR(0) 항목 만을 합해준다. 그리고 reduce 항목의 lookahead는 이들 LR(1) 항목의 lookahead의 합으로 정해준다. 이를 알고리즘으로 표현하면 다음과 같다.
  4. 두 번째 방법인 LR(0) 항목으로부터 LALR 파싱표를 구성하는 방법은 SLR 방법과 유사하다. 먼저 정의된 문법의 LR(0) 항목 집합의 canonical collection을 구성한다. 그러면 파싱표의 shift와 accept 그리고 GOTO 행동은 SLR과 같고, reduce행동은 각 reduce 항목의 lookahead에 의해 결정되므로, 이를 위해서 LR(0) 항목 집합의 canonical collection으로부터 reduce 항목의 lookahead를 구한다.
  5. LALR방법은 LR(0) 항목의 집합을 구한 후 파싱표를 만들기 위해 reduce 항목이 있는 각 상태에서 lookahead 기호를 구하는 데 상당한 시간과 노력이 소요된다. 이러한 관계로 최근의 LALR 방법에 대한 연구는 lookahead를 보다 효율적으로 구하는 데 많은 관심이 고조되고 있다.
  • 연습문제1
    다음은 LALR 구문분석에 관한 설명이다. 틀린 것은?
    답을 체크하세요
    정답 :
    ② 번이 틀렸다.
    LALR 파싱표는 LR(1)에서 유도하는 방법과 LR(0)에서 유도하는 두 가지 방법이 있다. 
  • 연습문제2
    다음은 CLR 그래프를 이용하여 파싱표를 구성하는 과정이다. CLR 그래프로부터 LALR의 파싱표를 구할 수 있다. 다음은 core가 같은 상태를 찾는 과정인데 틀리는 것은?


    크게보기
    답을 체크하세요
    정답 :
    ① CLR 그래프를 살펴보면 I1 과 I5 는 같은 core 가 없다.
    여기서 core가 같은 상태를 찾으면 된다. 우선 상태 I3와 I6가 같은 core를 가지므로,
    I3 ∪ I6 ⇒ I36 = {[C → c·C, c/d/$], [C → · cC, c/d/$],
    [C → ·d, c/d/$]}
    같은 방법으로
    I4 ∪ I7 ⇒ I47 = [[C → d·, c/d/$]},
    I8 ∪ I9 ⇒ I89 = {[C → cC·, c/d/$]} 이다.
    따라서 LALR 파싱표는 다음과 같다. 
  • 연습문제3
    (3-5) 다음은 CLR 그래프로부터 LALR의 파싱표를 구하는 과정이다.
    I47 을 구하면?


    크게보기
    답을 체크하세요
    정답 :
    I4 ∪ I7 ⇒ I47 = [[C → d․, c/d/$]},
  • 연습문제4
    (3-5) 다음은 CLR 그래프로부터 LALR의 파싱표를 구하는 과정이다.
    I89 을 구하면?


    크게보기
    답을 체크하세요
    정답 :
    I8 ∪ I9 ⇒ I89 = {[C → cC․, c/d/$]} 
  • 연습문제5
    (3-5) 다음은 CLR 그래프로부터 LALR의 파싱표를 구하는 과정이다.
    다음 중 I36 에 속하지 않는 것은?


    크게보기
    답을 체크하세요
    정답 :
    I3 ∪ I6 ⇒ I36 = {[C → c․C, c/d/$], [C → ․ cC, c/d/$],
                            [C → ․ d, c/d/$]}


댓글