Loading [MathJax]/jax/output/CommonHTML/jax.js

Context Free Grammar

2023. 9. 28. 07:24전공/컴파일러

Context free grammar(CFG)

  • G=(VN,VT,P,S)
    • VN : non-terminal symbols들의 집합
    • VT : terminal symbols들의 집합
      • VNVT=,VNVT=V
    • P : productions
      • αβ,αV+,βV
      • αVN,βV
    • S : 시작 기호(non-terminal symbol)

Context free language(CFL)

  • context free grammar에 의해 생성된 언어
  • L(G)={w|wVT and Sw}
  • L=L(G)이면 LΣ는 context free language

Derivation

  • 왼쪽부터 변환 or 오른쪽부터 변환

Parse trees(Derivation tree)

  • 특정 CFG의 기호들로 라벨 된 트리
    • 단말노드 : terminal symbol 또는 ε
    • 중간노드 : non-terminal symbol
    • Root노드 : Start symbol

Leftmost (rightmost) derivation

  • leftmost derivation
    • lmV×V
    • α=uAρ,β=uγρ
      uΣ,ρV,(Aγ)P이면
      모든 α,βV에 대하여, αlmβ
    • 가장 왼쪽의 not-terminal 기호를 계속해서 대체
  • rightmost derivation
    • rmV×V
    • α=λAv,β=λγv
      vΣ,λV,(Aγ)P이면
      모든 α,βV에 대하여, αrmβ
    • 가장 오른쪽의 not-terminal 기호를 계속해서 대체

모호한 문법

  • 같은 문자열에 대해 두 개 이상의 다른 leftmost(rightmost) derivation 존재
    → 2개 이상의 parse tree 존재
    ⇒ 모호함
  • 모호함을 증명하려면 2개 이상의 parse tree를 생성

Parsing and membership problem

  • 파싱 하는 것은 w가 L(G)에 포함되는지 찾고 그렇다면 w를 derivation
  • membership problem(인식 문제)
    • 주어진 문자열 w와 언어 L에 대하여 w가 L에 포함되는지 결정

모호한 context free grammar

  • context free grammar는 어떤 문자열 w에 대해 두 개 이상의 derivation이 존재할 경우 모호하다
  • context free grammar는 본질적으로 모호함
  • 문법이 모호한지 여부는 파싱의 복잡성에 영향을 줌
  • 모호하지 않은 문법이면 더 쉽게 파싱이 가능
  • context free grammar를 모호하지 않게 만드는 것은 불가능
    • 몇 가지 CFL에 대해 모호함을 제거하면 가능할 수도
    • 모호한 문법을 모호하지 않게 자동으로 변환하는 것은 불가능

CFG and Backus-Naur Form(BNF)

  • 프로그래밍 언어는 재귀적 구조를 가짐
  • 이런 재귀적 구조를 위한 표기법
  • 프로그래밍 언어의 구문
  • Backus-Naur Form
    • <expr>::=<expr>+<term>|<term>
    • <term>::=<term>+<factor>|<factor>
  • 모호함
    • 결과는 다를 수 있음

Grammar transform( 문법 변환)

Context-free grammar equivalence

  • 같은 언어를 생성하면 G1=G2

문법 변환을 해야 하는 이유

  • 많은 문법은 같은 언어를 생성
  • CFG에서 w가 L(G)에 속하는지 확인하는 데 걸리는 시간 복잡도
    • CKY 알고리즘 : O(|w|3)
  • 파싱 알고리즘은 어떤 문법에서 더 효율적
    • 사용하지 않는 production, ε-production rule, 단일 production rule 제거
  • ⇒ 효율적인 파싱 알고리즘을 위해 문법 변환

필요 없는 productions

  • CFG에서 필요 없는 rule을 포함하고 있을 수 있음
  • terminal symbol로 변환되지 않는 non terminal symbol
  • 사용되지 않는 non-terminal symbol

필요 없는 productions을 제거하는 방법

  • T(G) : terminal symbol로 변환되는 non terminal symbol들의 집합
    AVN|wVT,A+w
    • T1=AVN|(Aw)P,with wVT
      바로 terminal symbol로 가는 non terminal symbol
    • Tn+1=TnAVN|(Aβ)P,with β(TnVT)
      Tn이나 불필요한 non-terminal symbol로 가는 non-terminal symbol
    • Tn+1=Tn,T(G)=Tn
  • ST(G)이면, L(G)=
  • ST(G)이면, U(G)={AT(G)|α,β(T(G)VT),SαAβ}
    필요한 non terminal symbol 집합
  • U(G) : 시작 기호에서 도달할 수 있는 nonterminal symbol들의 집합
    • U1=AT(G)|(SαAβ)P, with α,β(T(G)VT)
    • Un+1=UnBT(G)|(AαBβ)P, with AUn,α,β(T(G)VT)
    • Un+1=Un,U(G)=UnS
  1. T(G)를 구하고 T(G)에 해당하지 않는 non-terminal symbol을 사용하는 rule 제거
  2. U(G)를 구하고 U(G)에 해당하지 않는 non-terminal symbol을 사용하는 rule 제거

축소된 CFG(Reduced CFG)

  • 모든 non terminal이 사용되는 CFG
    • 필요 없는 rule이 제거되지 않으면 어떤 파서들은 loop를 돌 것이다.

ε-production rules 제거

  • ε-production rules : A → ε
  • E(G) : 한 번 이상 derivation 해서 ε이 되는 non-terminal symbol
    (제거해도 되는 non-terminal symbol들의 집합)
    AVN| A+ε
  • E0=AVN|(Aε)P
  • Ei+1=EiA|(AB1,...,Bj,...,Bk)P, with BjEi,ijk
  • E0E1...EiEi+1...VN

ε-free grammar

  • G=(VN,VT,P,S)G=(VN,VT,P,S) 생성
  • L(G)=L(G)
  • PSε, and SεP iff εL(G)를 제외하고는 ε-rule을 가지지 않음
  • S는 production에서 오른쪽에 나타나지 않음
  • Gε-free grammar

ε-free grammar로 변환

  1. E(G)를 구한다
  2. ε을 대입한 rule을 구함
  3. S가 E(G)에 포함되면 S’ → S | ε

Single production rule 제거

  • single production rule : AB,A,BVN
    non terminal symbol이 non-terminal symbol로 가는 것 → 사이클 형성
  • chain rule을 제거해야 함
  • IA:BVN|A+B forAVN
    non-terminal symbol에서 한번 이상 derivation 해서 non-terminal symbol로 가는 것
    • IA,0=BVN|(AB)P
    • IA,i+1=IA,iCVN|(BC)P, with BIA,i
    • IA,0IA,1...IA,iIA,i+1...VN
    • IA,i0=IA,i(0+1)

Cycle-free grammar

  • G=(VN,VT,P,S)G=(VN,VT,P,S) 생성
  • L(G)=L(G)
  • P 에 있는 모든 rule은 Aα 형태 (|α|2 or αΣ or Sε 일 때)
  • S는 production에서 오른쪽에 나타나지 않음
  • G이 cycle-free grammar

Cycle free grammar로 변환

  1. P=PAB|A,BVN
    P에서 한번 non-terminal symbol에서 단일 non-terminal symbol로 가는 rule 제거
  2. 모든 non-terminal symbol에 대해 IA구하기
  3. P에 위에서 구한 IA 에 해당하는 rule 붙여주기

적절한 CFG

  • 축소된 CFG
  • ε-free CFG
  • cycle-free CFG

'전공 > 컴파일러' 카테고리의 다른 글

Lex  (0) 2023.09.28
Lexical analysis  (0) 2023.09.28
Finite Automata  (0) 2023.09.28
Regular expression  (0) 2023.09.28
Formal Language, Grammar and Automata  (0) 2023.09.28