学习资料:
https://blog.csdn.net/happyeveryday62/article/details/103845740
六、上下文无关语言
Conventions 约定规定
-
字符A,B,C,… : Grammar Variables 文法变量(大写)
-
字符a, b, c, … : Grammar Terminals 文法终结符 (小写)
- 一些字符串也可以作为文法终结符,例如num, id等
-
α , β , γ , δ … \alpha,\beta,\gamma,\delta … α,β,γ,δ… 表示一些符号标志字符串
- ε \varepsilon ε可以表示变量 和/或 终结符
特定的文法规定:
- 最左侧的为最高规则
- 可以简写规则。例如: A → a , A → β , A → γ A\rightarrow a, A \rightarrow \beta, A \rightarrow \gamma A→a,A→β,A→γ 可以总结为; A → α ∣ β ∣ γ A \rightarrow \alpha | \beta |\gamma A→α∣β∣γ
- 左侧规则(变量) => 右侧规则(变量/终结符)
CFG(Context-free Grammar)上下文无关文法
定义:
由文法生成的所有字符串的集合称为文法的语言
例子:
-
{ a n b n ∣ n ≥ 0 } \{a^nb^n|n\ge0\} {anbn∣n≥0}
使用CFG表示其规则为: A → a A b ∣ ε A \rightarrow aAb|\varepsilon A→aAb∣ε
解释: A可以递推为 a A b aAb aAb可以为递归为空串 ε \varepsilon ε,当仅递归一次且为空串时,就表示n=1即ab,当递归多次时,例如n=2,对应的推导过程就是: $A \rightarrow aAb \rightarrow aaAbb \rightarrow aabb $
Grammar in Chomsky Normal Form 乔姆斯基范氏
定义:
首先必须是CFG,其次每个规则都满足如上范式那么就是乔姆斯基范式
乔姆斯基范式有两个特点:1. 一分为二 2.终级化.
Normalization of a CFG 标准化上下文无关文法
将任意一个上下文无关文法CFG转为乔姆斯基范式的步骤如下:
-
引入新的起始变元
例如:原来为 S → a S \rightarrow a S→a,现在为 S 0 → S , S → a S_0 \rightarrow S, S \rightarrow a S0→S,S→a
-
从下往上删除 A → ε A \rightarrow \varepsilon A→ε规则
例如: 将$B \rightarrow xAy 和 和 和A \rightarrow \varepsilon$改为 B → x A y ∣ x y B \rightarrow xAy | xy B→xAy∣xy
-
从上往下删除传递规则
例如:将 A → B A \rightarrow B A→B和 B → x C y B \rightarrow xCy B→xCy改为 A → x C y A \rightarrow xCy A→xCy和 B → x C y B \rightarrow xCy B→xCy
-
添加新变元,使得所有变量规则都是一分为二
例如:将 A → B 1 B 2 … B k A\rightarrow B_1B_2…B_k A→B1B2…Bk 改为 A → B 1 A 1 , A 1 → B 2 A 2 , … , A k − 2 → B k − 1 B k A \rightarrow B_1A_1, A_1 \rightarrow B_2A_2, …,A_{k-2} \rightarrow B_{k-1}B_k A→B1A1,A1→B2A2,…,Ak−2→Bk−1Bk
-
添加终结符规则
例如 : a a a改为 T a → a T_a \rightarrow a Ta→a
例子
-
将 S → a S b ∣ ε S \rightarrow aSb|\varepsilon S→aSb∣ε标准化
-
第一步:引入新的起始变元
S 0 → S , S → a S b ∣ ε S_0 \rightarrow S, S \rightarrow aSb|\varepsilon S0→S,S→aSb∣ε
-
第二步:删除 ε \varepsilon ε(从后往前)
S → a S b ∣ ε S \rightarrow aSb|\varepsilon S→aSb∣ε 变为 S → a S b ∣ a b S \rightarrow aSb|ab S→aSb∣ab
初始的不删除, 否则规则改变(没有 ε \varepsilon ε),变为 : S 0 → S ∣ ε S_0 \rightarrow S | \varepsilon S0→S∣ε
-
第三步:从上往下删除传递规则
改变为: S 0 → a S b ∣ a b | ε , S → a S b ∣ a b S_0 \rightarrow aSb|ab|\varepsilon, S \rightarrow aSb|ab S0→aSb∣ab|ε,S→aSb∣ab
-
第四步:添加新变元,使得所有变量规则都是一分为二
令 S 1 = S b S_1= Sb S1=Sb, 则变为 S 0 → a S 1 ∣ a b | ε , S → a S 1 ∣ a b , S 1 → S b S_0 \rightarrow aS_1|ab|\varepsilon, S \rightarrow aS_1|ab, S_1\rightarrow Sb S0→aS1∣ab|ε,S→aS1∣ab,S1→Sb
-
第五步:添加终结符规则
令 T a → a , T b → b T_a \rightarrow a, T_b \rightarrow b Ta→a,Tb→b, 则变为: S 0 → T a S 1 ∣ T a T b | ε , S → T a S 1 ∣ T a T b , S 1 → S T b , T a → a , T b → b S_0 \rightarrow T_aS_1|T_aT_b|\varepsilon, S \rightarrow T_aS_1|T_aT_b, S_1\rightarrow ST_b, T_a\rightarrow a, T_b \rightarrow b S0→TaS1∣TaTb|ε,S→TaS1∣TaTb,S1→STb,Ta→a,Tb→b
至此, S 0 、 S 、 S 1 S_0、S、S_1 S0、S、S1均符合 A → B C A \rightarrow BC A→BC, 且B、C即 T a 、 T b 、 S 1 T_a、T_b、S_1 Ta、Tb、S1均不为初始变元; T a 、 T b 符 合 A → a T_a、T_b符合A \rightarrow a Ta、Tb符合A→a
-
DFA转换为CFG
因为 R L ⊆ C F G RL \subseteq CFG RL⊆CFG, 所以DFA都可以转换成为CFG
D F A = ( Q , Σ , q 0 , F , δ ) DFA = (Q,\Sigma,q_0,F,\delta) DFA=(Q,Σ,q0,F,δ), C F G = ( V , Σ , R , S ) CFG = (V,\Sigma,R,S) CFG=(V,Σ,R,S)
方法:
-
V = Q , S = q 0 V = Q, S = q_0 V=Q,S=q0
-
求CFG的规则:
根据转移函数的变换规则: q i → x δ ( q i , x ) f o r a l l q i ∈ V a n d a l l x ∈ Σ q_i \rightarrow x\delta(q_i,x) \ for \ all \ q_i \in V and \ all \ x\in \Sigma qi→xδ(qi,x) for all qi∈Vand all x∈Σ
根据终态的变换规则: q i → ε f o r a l l q i i n F q_i \rightarrow \varepsilon \ for \ all \ q_i \ in \ F qi→ε for all qi in F