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

컴파일러구성 - [제7장] 구문분석 개요

by boolean 2016. 7. 12.
728x90

컴파일러구성 - [제7장] 구문분석 개요

bottom-up 구문분석 shift-reduce 구문분석, FIRST 와 FOLLOW

컴파일러 용어정리

  • 핸들(handle) : Bottom-up 구문분석에서 reduce 되는 부분
  • reduce : 유도과정을 거꾸로 적용한 것. 즉, S ‗⇒ αAw ‗⇒ αβw의 유도과정이 존재할 때, 문장형태 αβw 에서 β를 A로 대체하는 것
  • Shift : 입력기호를 스택에 넣는 것
  • 단일 생성규칙(single production)
    FOLLOW(A) = {a ∈ VT ∪ {$} | S ‗⇒ αAaβ, α, β ∈ V}
    즉, 어떤 문장형태에 있어서, 논터미널 A 다음에 나타나는 터미널 기호들의 집합이다. 여기에서 $기호는 입력 문자열의 끝을 나타내는 기호
  • FIRST : 문자열 α로부터 유도되어, 첫 번째로 나타날 수 있는 터미널기호들의 집합
  • 요점정리

    1. 구문분석 방법은 크게 Top-down 방법과 Bottom-up 방법의 두 종류로 나누어 볼 수 있다. Top-down방법은 시작기호로부터 시작하여 정의된 문법의 규칙(rule)들을 적용하여 유도에 의한 주어진 문자열을 찾아가는 방법이고, 반대로 Bottom-up 방법은 입력된 문자열에서 감축(reduce)에 의해 시작기호를 찾아가는 방법이다.
    2. Bottom-up 구문분석의 방법으로 스택과 입력 버퍼 등을 사용하는 Shift-reduce 구문분석이 있다. shift와 reduce를 사용하여 진행하는데 시작기호가 나오면 올바른 문장으로 accept 된 것이다.
    3. Shift-reduce 구문분석에서 shift 는 입력기호를 스택에 넣어주는 것이고 reduce 는 스택에 있는 입력기호를 가져와서 문법에 맞게 reduce 해주는 것을 의미한다.
    4. Shift-reduce 구문분석에서 문법에 맞게 reduce 해주는 기호가 가장 중요한데 그 것을 e핸들(handle) 이라고 한다.
    5. FOLLOW(A) 는 어떤 문장형태에 있어서, 논터미널 A 다음에 나타나는 터미널 기호들의 집합이다. FIRST(A)는 A로부터 유도되어 첫 번째로 나타날 수 있는 터미널기호들의 집합이다. 

    연습문제

    • 연습문제1
      다음 설명 중 잘못 설명된 것은?
      답을 체크하세요
      정답 :
      해설: Shift-reduce 구문분석은 Bottom-up 구문분석 방법이다. 
    • 연습문제2
      다음은 주어진 문법을 보고 id*id+id를 우단 유도하고 핸들을 표시한 것이다. 다음 중 핸들을 잘못 표시한 단계가 있는가?
          1) E → E * E
          2) E → E + E
          3) E → id

      우단유도 과정            (핸들)
      1. E →   E * E          (E * E)
      2. E →   E * E + E     (E + E)
      3. E →   E * E + id     (id)
      4. E →   E * id + id     (id)
      5. E →   id * id + id     (id)
      답을 체크하세요
      정답 :
      모두 올바르다.
    • 연습문제3
      계속해서 shift-reduce 구문분석 하는 과정이다.
      빈칸 ‘가’에 알맞은 것은?

      단 계

      스 택

      입 력

      구문분석 행동

      0

      $

      id*id+id $

      shift ( 가 )

      1

      $id

      *id+id $

      reduce ( 나 )

      2

      $E

      *id+id $

      shift *

      3

      $E*

      id+id $

      shift id

      4

      $E*id

      +id $

      reduce E id

      5

      $E*E

      +id $

      shift +

      6

      $E*E+

      id $

      shift id

      7

      $E*E+id

      $

      reduce E id

      8

      $E*E+E

      $

      reduce( 다 )

      9

      $E*E

      $

      reduce( 라 )

      10

      $E

      $

      accept

      답을 체크하세요
      정답 :
      왜냐하면 id가 핸들이므로 
    • 연습문제4
      계속해서 shift-reduce 구문분석 하는 과정이다.
      빈칸 ‘나’에 알맞은 것은?

      단 계

      스 택

      입 력

      구문분석 행동

      0

      $

      id*id+id $

      shift ( 가 )

      1

      $id

      *id+id $

      reduce ( 나 )

      2

      $E

      *id+id $

      shift *

      3

      $E*

      id+id $

      shift id

      4

      $E*id

      +id $

      reduce E id

      5

      $E*E

      +id $

      shift +

      6

      $E*E+

      id $

      shift id

      7

      $E*E+id

      $

      reduce E id

      8

      $E*E+E

      $

      reduce( 다 )

      9

      $E*E

      $

      reduce( 라 )

      10

      $E

      $

      accept

      답을 체크하세요
      정답 :
      E → id, 왜냐하면 id가 핸들이므로 
    • 연습문제5
      계속해서 shift-reduce 구문분석 하는 과정이다.
      빈칸 ‘다’에 알맞은 것은?

      단 계

      스 택

      입 력

      구문분석 행동

      0

      $

      id*id+id $

      shift ( 가 )

      1

      $id

      *id+id $

      reduce ( 나 )

      2

      $E

      *id+id $

      shift *

      3

      $E*

      id+id $

      shift id

      4

      $E*id

      +id $

      reduce E id

      5

      $E*E

      +id $

      shift +

      6

      $E*E+

      id $

      shift id

      7

      $E*E+id

      $

      reduce E id

      8

      $E*E+E

      $

      reduce( 다 )

      9

      $E*E

      $

      reduce( 라 )

      10

      $E

      $

      accept

      답을 체크하세요
      정답 :
      E → E+E 왜냐하면 E+E 가 핸들이므로 
    • 연습문제6
      계속해서 shift-reduce 구문분석 하는 과정이다.
      빈칸 ‘라’에 알맞은 것은?

      단 계

      스 택

      입 력

      구문분석 행동

      0

      $

      id*id+id $

      shift ( 가 )

      1

      $id

      *id+id $

      reduce ( 나 )

      2

      $E

      *id+id $

      shift *

      3

      $E*

      id+id $

      shift id

      4

      $E*id

      +id $

      reduce E id

      5

      $E*E

      +id $

      shift +

      6

      $E*E+

      id $

      shift id

      7

      $E*E+id

      $

      reduce E id

      8

      $E*E+E

      $

      reduce( 다 )

      9

      $E*E

      $

      reduce( 라 )

      10

      $E

      $

      accept

      답을 체크하세요
      정답 :
      E → E*E , 왜냐하면 E*E 가 핸들이므로
    • 연습문제7
      다음 문법을 보고 First(E)를 구하면?
      연습문제 설명
          1) E → E + T
          2) E → T
          3) T → T * F
          4) T → F
          5) F → (E)
          6) F → id
      답을 체크하세요
      정답 :
    • 연습문제8
      다음 문법을 보고 Follow(E)를 구하면?
      연습문제 설명
          1) E → E + T
          2) E → T
          3) T → T * F
          4) T → F
          5) F → (E)
          6) F → id
      답을 체크하세요
      정답 :
      출발기호니까 당연히 뒤에 ‘ $ ’ 가 있다.
      1) 번 규칙은 E →E + T 이므로 ‘ + ’ 가 있다.
      5) 번 규칙 F →(E) 에서는 ‘ ) ’ 가 있다.
      따라서 FOLLOW(E) = { $, +, ) } 


    댓글