1. 上下文无关文法(CFG)
1. 上下文无关文法
上下文无关文法 (Context-Free Grammars):CFG是一个四元组,如:G=(V,T,S,P),其中
-
V:变元的集合,是一个有限集;(变量)
-
T:终结符的集合,是一个有限集,且 V∩T=ϕ;(值)
-
S:开始变元,S∈V;
-
P:产生式的集合,是一个有穷集,其中的每个元素都有形式:A→α,其中 A∈V,α∈(V∪T)∗
派生:由产生式生成字符串的过程。
-
最左派生:每次选取派生式的最左的变元派生替换。
-
最右派生:每次选取派生式的最右变元派生替换。
例如:L={a2nbm∣n≥0,m≥0} 的产生式为:S→AB,A→ε∣aaA,B→ε∣Bb
对于字符串 w=aabb 来说,派生式如下:
S⇒AB⇒aaAB⇒aaABb⇒aaBb⇒aaBbb⇒aabb
-
最左派生:S⇒AB⇒aaAB⇒aaB⇒aaBb⇒aaBbb⇒aabb
-
最右派生:S⇒AB⇒ABb⇒ABbb⇒Abb⇒aaAbb⇒aabb
上下文无关语言 (CFL):G=(V,T,S,P) 是一个CFG,则 L(G)={w∣w∈T∗andS⟹∗w}
2. 语法分析树
语法分析树:G=(V,T,S,P) 是一个CFG,一个G的语法分析树如下:
- 每个内节点都标了一个 V 中的变元;
- 每个叶节点都标了一个 T∪{ε} 中的符号,所有被 ε 标记的叶节点都是其父节点的唯一子节点;
- 如果一个内节点标记为A,它的子节点(从左到右)标记为 x1,x2,…,xk,则 A→x1,x2,…,xk∈P
例:L={w∣w∈{0,1}∗andw=wR} 产生式为 S→ε∣0∣1∣0S0∣1S1 两个语法分析树如下:
![[HIT-FLAA]哈工大2020春形式语言与自动机复习笔记 (3) [HIT-FLAA]哈工大2020春形式语言与自动机复习笔记 (3)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzE0My9mNjY4M2FlMTI5N2RhYmYyZmIwOGQxMzc5YjU2NjZkNy5wbmc=)
3. 二义性
对于一个CFG:G=({E,I},{a,b,(,),+,∗},E,P),产生式为 E→I∣E+E∣E∗E∣(E),I→a∣b
对于字符串 w=a+a∗a 的两种最左派生如下:
E⇒E∗E⇒E+E∗E⇒I+E∗E⇒a+E∗E⇒a+a∗aE⇒E+E⇒I+E⇒a+E⇒a+E∗E⇒a+a∗a
对应的语法分析树如下,发现一个先算的是加法,一个先算的是乘法,出现了歧义。
![[HIT-FLAA]哈工大2020春形式语言与自动机复习笔记 (3) [HIT-FLAA]哈工大2020春形式语言与自动机复习笔记 (3)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzEyNC9iYjYwNWM5YzZmYmFlMmQxZTJkNjM4ZjFjM2ZlZDQ0NC5wbmc=)
重新构造产生式以消除歧义:
先算乘法的:E→I∣E+E∣E∗E∣(E),I→a∣b
先算加法的:E→T∣E+T,T→F∣T∗F,F→I∣(E),I→a∣b∣Ia∣Ib
定义同样的语言可以有多个文法,如果一个CFL的所有文法都是歧义的,那么它是固有二义性的
4. CFG的化简
- 去掉 ε 产生式;
- 去掉单元产生式;
- 去掉无用的产生式;
5. 乔姆斯基范式(CNF)
乔姆斯基范式(Chomsky Normal Form):一个CFG的所有的产生式都有如下两种形式之一:
-
A→BC,A,B,C∈V
-
A→a,a∈T
CFG可以转换为CNF的形式,如下例子。
例:将 S→ABa,A→aab,B→Ac 转化为CNF的形式
解:S→AC,A→DE,B→AF,C→BD,D→a,F→c,E→DG,G→b
2. 下推自动机(PDA)
由于FA有局限性,可以识别M={0n1m∣n≥0,m≥0},但不能识别L={0n1n∣n≥0},所以有了PDA
1. PDA的定义
下推自动机(Pushdown Automata):PDA是一个七元组P=(Q,Σ,Γ,δ,q0,z0,F),其中,
-
Q 是有限的状态集;
-
Σ 是有限的输入字符集;
-
Γ 是有限的栈字符集;
-
δ 是状态转移函数;
-
q0 是初始状态,是一个映射 Q×(Σ∪{ε})×Γ⇒2Q×Γ∗;
-
z0 是初始栈符,表示栈是空的;
-
F 是终结状态集;
例:构造PDA识别 L={wwR∣w∈{0,1}∗}
解:第一步,把 w 入栈
δ(q,0,z0)=(q,0z0),δ(q,1,z0)=(q,1z0)δ(q,0,0)=(q,00),δ(q,1,0)=(q,10)δ(q,0,1)=(q,01),δ(q,1,1)=(q,11)
第二步,从栈中弹出 wR
δ(q,1,1)=(p,ε),δ(q,0,0)=(q,ε)δ(p,1,1)=(p,ε),δ(p,0,0)=(q,ε)
第三步,转移到终结状态 δ(p,ε,z0)=(r,z0)
图示如下,这是一个不确定的PDA
![[HIT-FLAA]哈工大2020春形式语言与自动机复习笔记 (3) [HIT-FLAA]哈工大2020春形式语言与自动机复习笔记 (3)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMwMy9hZDNiYzVkZjNlNWFjMWY3ODY1Y2U3YWFjZDU2MzQ0Zi5wbmc=)
2. 确定的PDA
如果一个PDA P=(Q,Σ,Γ,δ,q0,z0,F) 是确定的,那么它满足下面的条件:
-
∀q∈Q,∀a∈Σ∪{ε},∀X∈Γ,δ(q,a,X) 的结果是唯一的;
-
δ(q,a,X) 和 δ(q,ε,X) 只能有一个有定义,因为对于状态q来说,读 ε 意味着不读 a,而另一个意味着读 a,所以读与不读就产生了不确定性。
例:构造确定的PDA识别 L={0n1n∣n>0}
解:这就是一个DPDA
![[HIT-FLAA]哈工大2020春形式语言与自动机复习笔记 (3) [HIT-FLAA]哈工大2020春形式语言与自动机复习笔记 (3)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzY2NS8wMjQ1MWRhZDI0NjU1MDllM2U2NTBjOWIxNjdlOGY3OS5wbmc=)
3. PDA的瞬时描述
用一个三元组 (q,w,α) 来描述一个PDA在某一时刻的格局,其中,
-
q 是PDA此时的状态;
-
w 是剩余的待读入字符串;
-
α 是栈中的字符串。
例:用格局序列描述2中构造的 L={0n1n∣n>0} 的PDA接受 w=0011 的过程。
解:(q,0011,z0)┝(q,011,0z0)┝(q,11,00z0)┝(p,1,0z0)┝(p,ε,z0)┝(r,ε,z0)
简记为 (q,0011,z0)┝∗(r,ε,z0)
4. PDA接受的语言
PDA可以用两种方式描述接受语言:
- 用终结状态来描述:L(P)={w∣(q0,w,z0)┝∗(q,ε,α),q∈F}
- 用空栈状态来描述:N(P)={w∣(q0,w,z0)┝∗(q,ε,α)}
- 这两种描述方式是等价的,即 L(P)⇔N(p)
例如2中构造的 L={0n1n∣n>0} 的PDA就是用终结状态接受的,也可用空栈状态来描述,如下
![[HIT-FLAA]哈工大2020春形式语言与自动机复习笔记 (3) [HIT-FLAA]哈工大2020春形式语言与自动机复习笔记 (3)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzk3Ny8wZWVmM2VhMTdmZGQ0Njc0ZWNlNjI1YjdhOWUxN2NjMS5wbmc=)
但是并不是所有的PDA都可以用两种方式构造 (针对DPDA),当 L 可以被终结状态的DPDA接受并且 L 有前缀性的时候,L 才能被空栈状态的DPDA接受。
语言的前缀性:该语言中没有两个不同的字符串x和y,使得x是y的前缀。
如:语言 0* 就没有前缀性,因为0是00的前缀。
3. CFG和PDA的等价性
对于一个给定的上下文无关语言 L,存在一个CFG生成 L,且存在一个PDA识别 L。
1. CFG ⇒ PDA
把CFG G=(V,T,S,P) 转化为PDA,则对应的PDA为 B=({q},T,V∪T,δ,q,S,{}),其中,
- δ(q,ε,A)={(q,α)∣A→α∈P}
- δ(q,a,a)=(q,ε)
例:将CFG G=({S},{0,1},{S→0S1,S→SS,S→ε},S) 转化为PDA。
解:PDA为 P=({q},{0,1},{0,1,S},δ,q,S,{}),其中 δ 定义如下:
- δ(q,ε,S)={(q,0S1),(q,SS),(q,ε)}
- δ(q,0,0)={(q,ε)}
- δ(q,1,1)={(q,ε)}
用图表示
![[HIT-FLAA]哈工大2020春形式语言与自动机复习笔记 (3) [HIT-FLAA]哈工大2020春形式语言与自动机复习笔记 (3)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzE5MS9hNjJiOTQ1MDA0MTUyYWQ3N2UyYzgzNWE2YWZjYzE4Ny5wbmc=)
该PDA识别字符串 w=0011 的过程:
(q,0011,S)┝(q,0011,0S1)┝(q,011,S1)┝(q,011,0S11)┝(q,11,S11)┝(q,11,11)┝(q,1,1)┝(q,ε,ε)
对应的CFG派生序列:S⇒0S1⇒00S11⇒0011
转化出的PDA实际上是在模拟CFG的派生过程,所以PDA一定能就识别CFG生成的字符串
2. PDA ⇒ CFG
把PDA P=(Q,Σ,Γ,δ,q0,z0,F) 转化为CFG,则对应的CFG为 G=(V,Σ,S,R),其中,
-
V :包括开始变元 S,这个变元和PDA没有关系,就是强行规定的;还有其他形如 [qXp] 的符号,其中∀q,p∈Q,X∈Γ
- 符号 [qXp] 的意义是在 q 状态下,可以使栈中的 X 弹出并转移到 p 状态的字符串,例如有状态转移函数 δ(q0,ε,z0)=(p,ε),则 [q0z0p]→ε,于是对于下面 R 的第一条产生式规则,就有S→[q0z0p]
-
R :包括 ∀p∈Q,S→[q0z0p];还有 [qXrk]→a[rY1r1][r1Y2r2]...[rk−1Ykrk],对于 (r,Y1Y2...Yk)∈δ(q,a,X)
- 第一条产生式规则已经在上一条中描述了,下面是关于第二条产生式规则。对于状态转移函数 δ(q,a,X)=(r,Y1Y2...Yk),因为 [qXrk] 表示的是把 X 全pop掉所需要的字符串,而状态转移函数读入字符串 a 之后栈中的元素是 Y1Y2...Yk,所以需要把这些元素也pop掉,因此最后的状态就不是 r 而是 rk,而第二条产生式规则的body部分 a 之后的部分就是做这个的。
例:还是用 2.2确定的PDA 中的例子,将其转化成CFG
![[HIT-FLAA]哈工大2020春形式语言与自动机复习笔记 (3) [HIT-FLAA]哈工大2020春形式语言与自动机复习笔记 (3)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzY2NS8wMjQ1MWRhZDI0NjU1MDllM2U2NTBjOWIxNjdlOGY3OS5wbmc=)
解:P=(Q,Σ,Γ,δ,q0,z0,F)⇒G=(V,Σ,S,R),其中 V={S,[qz0q],[qz0p],[q0q],[q0p],[q1q],[q1p],[pz0q],[pz0p],[p0q],[p0p],[p1q],[p1p]}
然后根据转移函数导出产生式 R
- δ(q,0,z0)=(q,0z0)⇒[qz0r2]→0[q0r1][r1z0r2],∀r1,r2∈Q⇒[qz0q]→0[q0q][qz0q]∣0[q0p][pz0q][qz0p]→0[q0q][qz0p]∣0[q0p][pz0p]
- δ(q,0,0)=(q,00)⇒[q0r2]→0[q0r1][r10r2],∀r1,r2∈Q⇒[q0q]→0[q0q][q0q]∣0[q0p][p0q][q0p]→0[q0q][q0p]∣0[q0p][p0p]
- δ(q,ε,z0)=(p,z0)⇒[qz0r1]→[pz0r1],∀r1∈Q⇒[qz0q]→[pz0q][qz0p]→[pz0p]
- δ(q,1,0)=(p,ε)⇒[q0p]→1
- δ(p,1,0)=(p,ε)⇒[p0p]→1
- δ(p,ε,z0)=(p,ε)⇒[pz0p]→ε
把得到的产生式整合在一起得到 R
R={S→[qz0q]∣[qz0p],[qz0q]→0[q0q][qz0q]∣0[q0p][pz0q],[qz0p]→0[q0q][qz0p]∣0[q0p][pz0p],[q0q]→0[q0q][q0q]∣0[q0p][p0q],[q0p]→0[q0q][q0p]∣0[q0p][p0p],[qz0q]→[pz0q],[qz0p]→[pz0p],[q0p]→1,[p0p]→1,[pz0p]→ε}
最后把 R 按如下规则化简一下:
- 消除含有没有终结符的变元的产生式,如:含有 [pz0q] 的产生式;
- 消除死循环的产生式,如:[q0q] 的第一个产生式,因为它的第二个产生式由于 [p0q] 满足第一条化简规则,所以它只剩下第一个产生式,所以它死循环了;
- 消除含有由于前两条规则导致的无用变元的产生式,如:因为 [q0q] 无用,所以含有它的产生式也无用。
最终得到
R={S→[qz0p],[qz0p]→0[q0p][pz0p],[q0p]→0[q0p][p0p],[qz0p]→[pz0p],[q0p]→1,[p0p]→1,[pz0p]→ε}
看起来不太方便,于是令A=[qz0p],B=[q0p],C=[p0p],D=[pz0p],得到
R={S→A,A→0BD∣D,B→1∣0BC,C→1,D→ε}
再次化简得到:R={S→0B∣ε,B→1∣0BC,C→1}
4. 上下文无关语言的性质
1. 泵引理
上下文无关语言的泵引理:L 是一个CFL,则 ∃n,对 ∀w∈L,若 ∣w∣≥n,则 w 可以划分为 w=uvxyz,其中
-
∣vxy∣≤n
-
∣vy∣≥1,(要是vy同时为空就出现 A→A 这种没有意义的产生式了)
-
uvixyiz∈L,∀i=0,1,2,...
n的取法:令 m=∣V∣,k=max{∣α∣∀A→α},则 n=km
派生过程:S⇒∗uAz⇒∗uvAyz⇒∗w,语法解析树如下,对于重复出现的 A 来说,则可用子树的A代替父节点,此时失去的就是一对vy节点。
![[HIT-FLAA]哈工大2020春形式语言与自动机复习笔记 (3) [HIT-FLAA]哈工大2020春形式语言与自动机复习笔记 (3)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzg0Ni83OGU3YTkwODM1MGY5NmEzOTc0ODQ5ZjVmMjQ3NjA2Ni5wbmc=)
例:证明 L={ww∣w∈{0,1}∗} 不是CFL。
解:假设L是CFL。则由泵引理可知,存在一个常数n,对于L中长度不小于n的字符串w就可以划分为五个部分,w=uvxyz,其中 ∣vxy∣≤n,vy=ε,uvkxykz∈L。
取 w=0n1n0n1n∈L,则 uvxyz=0n1n0n1n(如果要推出矛盾,就需要推出 uxz∈/L)。v和y不能同时为空串且 ∣vxy∣≤n,所以它们的取值情况可以分为7种情况,这七种情况又可以分为两类:
- 第一类:vxy在同一类字符里,即同在开始的n个0、同时在开始的n个1里、同时在结束的n个0里,同时在结束的n个1里。这四种情况是等价的,而显然在第一种情况下有 uxz∈/L,因为开始的0的个数不足n了。
- 第二类:vxy在连续的两类字符里,即在前半部分的 0n1n 中、在中间的 1n0n 中、在后半部分的 0n1n中。这三种情况是等价的,而显然在第一种情况下有 uxz∈/L,因为开始的0和1的个数都不足n了。
所有的情况都推出了矛盾,所以假设错误,即 L 不是CFL。
2. 封闭性
CFL在并、连接、星、反转、交、同态、逆同态运算下是封闭的,而在交、补运算下不是封闭的。
对于两个CFL L1 和 L2,令 G(L1)=(V1,T1,R1,S1),G(L2)=(V2,T2,R2,S2)
- 并:G(L1∪L2)=(V1∪V2∪{S},T1∪T2,R,S),R={S→S1∣S2}∪R1∪R2
- 连接:G(L1∪L2)=(V1∪V2∪{S},T1∪T2,R,S),R={S→S1S2}∪R1∪R2
- 星:G(L1∗)=(V1,T1,{S1→S1S1∣ε}∪R1,S1)
- 反转:G(L1R)=(V1,T1,{A→αR∣A→αR1},S1)
交运算不封闭,例如:L1={anbncm∣n≥0,m≥0},L2={anbmcm∣n≥0,m≥0} 是两个CFL,它们的交就是 L1∪L2={anbncn∣n≥0},这不是CFL,可以按照上面的方式用泵引理证明。
但是一个CFL和一个RL做交运算之后得到的还是CFL,这个条件下它是封闭的。