Context Free Grammar
2023. 9. 28. 07:24ㆍ전공/컴파일러
Context free grammar(CFG)
- G=(VN,VT,P,S)
- VN : non-terminal symbols들의 집합
- VT : terminal symbols들의 집합
- VN∩VT=∅,VN∪VT=V
- P : productions
- α→β,α∈V+,β∈V∗
- α∈VN,β∈V∗
- S : 시작 기호(non-terminal symbol)
Context free language(CFL)
- context free grammar에 의해 생성된 언어
- L(G)={w|w∈V∗T and S∗⇒w}
- 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
- ⇒lm⊆V∗×V∗
- α=uAρ,β=uγρ
u∈Σ∗,ρ∈V∗,(A→γ)∈P이면
모든 α,β∈V∗에 대하여, α⇒lmβ - 가장 왼쪽의 not-terminal 기호를 계속해서 대체
- rightmost derivation
- ⇒rm⊆V∗×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들의 집합
A∈VN|∃w∈VT,A+⇒w- T1=A∈VN|∃(A→w)∈P,with w∈VT
바로 terminal symbol로 가는 non terminal symbol - Tn+1=Tn∪A∈VN|∃(A→β)∈P,with β∈(Tn∪VT)∗
Tn이나 불필요한 non-terminal symbol로 가는 non-terminal symbol - Tn+1=Tn,T(G)=Tn
- T1=A∈VN|∃(A→w)∈P,with w∈VT
- S∉T(G)이면, L(G)=∅
- S∈T(G)이면, U(G)={A∈T(G)|∃α,β∈(T(G)∪VT)∗,S∗⇒αAβ}
필요한 non terminal symbol 집합 - U(G) : 시작 기호에서 도달할 수 있는 nonterminal symbol들의 집합
- U1=A∈T(G)|∃(S→αAβ)∈P, with α,β∈(T(G)∪VT)∗
- Un+1=Un∪B∈T(G)|∃(A→αBβ)∈P, with A∈Un,α,β∈(T(G)∪VT)∗
- Un+1=Un,U(G)=Un∪S
- T(G)를 구하고 T(G)에 해당하지 않는 non-terminal symbol을 사용하는 rule 제거
- 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들의 집합)
A∈VN| A+⇒ε - E0=A∈VN|(A→ε)∈P
- Ei+1=Ei∪A|∃(A→B1,...,Bj,...,Bk)∈P, with Bj∈Ei,i≤j≤k
- E0⊆E1⊆...⊆Ei⊆Ei+1⊆...⊆VN
ε-free grammar
- G=(VN,VT,P,S)로 G′=(V′N,VT,P′,S′) 생성
- L(G′)=L(G)
- P′ 는 S′→ε, and S′→ε∈P′ iff ε∈L(G)를 제외하고는 ε-rule을 가지지 않음
- S′는 production에서 오른쪽에 나타나지 않음
- G′이 ε-free grammar
ε-free grammar로 변환
- E(G)를 구한다
- ε을 대입한 rule을 구함
- S가 E(G)에 포함되면 S’ → S | ε
Single production rule 제거
- single production rule : A→B,A,B∈VN
non terminal symbol이 non-terminal symbol로 가는 것 → 사이클 형성 - chain rule을 제거해야 함
- IA:B∈VN|A+⇒B forA∈VN
non-terminal symbol에서 한번 이상 derivation 해서 non-terminal symbol로 가는 것- IA,0=B∈VN|(A→B)∈P
- IA,i+1=IA,i∪C∈VN|∃(B→C)∈P, with B∈IA,i
- IA,0⊆IA,1⊆...⊆IA,i⊆IA,i+1⊆...⊆VN
- IA,i0=IA,i(0+1)
Cycle-free grammar
- G=(VN,VT,P,S)로 G′=(V′N,VT,P′,S′) 생성
- L(G′)=L(G)
- P′ 에 있는 모든 rule은 A→α 형태 (|α|≥2 or α∈Σ or S′→ε 일 때)
- S′는 production에서 오른쪽에 나타나지 않음
- G′이 cycle-free grammar
Cycle free grammar로 변환
- P′=P−A→B|A,B∈VN
P에서 한번 non-terminal symbol에서 단일 non-terminal symbol로 가는 rule 제거 - 모든 non-terminal symbol에 대해 IA구하기
- 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 |