本系列文章
文章目录:上下文无关文法和下推自动机
1. 上下文无关文法(CFG)
1. 形式化定义
上下文无关文法 (Context-Free Grammars):CFG是一个四元组,如: G = ( V , T , S , P ) G=(V,T,S,P) G=(V,T,S,P),其中
- V V V:变元的集合,是一个有限集;(变量)
- T T T:终结符的集合,是一个有限集,且 V ∩ T = ϕ V \cap T = \phi V∩T=ϕ;(值)
- S S S:开始变元, S ∈ V S \in V S∈V;
- P P P:产生式的集合,是一个有穷集,其中的每个元素都有形式: A → α A \rightarrow \alpha A→α,其中 A ∈ V , α ∈ ( V ∪ T ) ∗ A \in V, \alpha \in (V \cup T)^* A∈V,α∈(V∪T)∗
派生:由产生式生成字符串的过程。
-
最左派生:每次选取派生式的最左的变元派生替换。
-
最右派生:每次选取派生式的最右变元派生替换。
例如: L = { a 2 n b m ∣ n ≥ 0 , m ≥ 0 } L=\{a^{2n}b^m | n \ge 0, m \ge 0 \} L={ a2nbm∣n≥0,m≥0} 的产生式为: S → A B , A → ε ∣ a a A , B → ε ∣ B b S\rightarrow AB,\, A\rightarrow \varepsilon | aaA,\, B\rightarrow \varepsilon | Bb S→AB,A→ε∣aaA,B→ε∣Bb
对于字符串 w = a a b b w=aabb w=aabb 来说,派生式如下:
S ⇒ A B ⇒ a a A B ⇒ a a A B b ⇒ a a B b ⇒ a a B b b ⇒ a a b b S\Rightarrow AB \Rightarrow aaAB \Rightarrow aaABb \Rightarrow aaBb \Rightarrow aaBbb \Rightarrow aabb S⇒AB⇒aaAB⇒aaABb⇒aaBb⇒aaBbb⇒aabb
最左派生: S ⇒ A B ⇒ a a A B ⇒ a a B ⇒ a a B b ⇒ a a B b b ⇒ a a b b S\Rightarrow AB\Rightarrow aaAB\Rightarrow aaB\Rightarrow aaBb\Rightarrow aaBbb \Rightarrow aabb S⇒AB⇒aaAB⇒aaB⇒aaBb⇒aaBbb⇒aabb
最右派生: S ⇒ A B ⇒ A B b ⇒ A B b b ⇒ A b b ⇒ a a A b b ⇒ a a b b S\Rightarrow AB\Rightarrow ABb\Rightarrow ABbb\Rightarrow Abb\Rightarrow aaAbb\Rightarrow aabb S⇒AB⇒ABb⇒ABbb⇒Abb⇒aaAbb⇒aabb
上下文无关语言 (CFL): G = ( V , T , S , P ) G=(V,T,S,P) G=(V,T,S,P) 是一个CFG,则 L ( G ) = { w ∣ w ∈ T ∗ a n d S ⟹ ∗ w } L(G)=\{w\;|\;w\in T^*\; and\; S \stackrel{*}{\Longrightarrow} w\} L(G)={ w∣w∈T∗andS⟹∗w}
2. 语法分析树
语法分析树: G = ( V , T , S , P ) G=(V,T,S,P) G=(V,T,S,P) 是一个CFG,一个G的语法分析树如下:
- 每个内节点都标了一个 V V V 中的变元;
- 每个叶节点都标了一个 T ∪ { ε } T\cup \{\varepsilon\} T∪{ ε} 中的符号,所有被 ε 标记的叶节点都是其父节点的唯一子节点;
- 如果一个内节点标记为A,它的子节点(从左到右)标记为 x 1 , x 2 , … , x k x_1,x_2, …, x_k x1,x2,…,xk,则 A → x 1 , x 2 , … , x k ∈ P A\rightarrow x_1,x_2, …, x_k \in P A→x1,x2,…,xk∈P
例: L = { w ∣ w ∈ { 0 , 1 } ∗ a n d w = w R } L=\{ w\; |\; w\in \{0,1\}^*\; and\; w = w^R \} L={
w∣w∈{
0,1}∗andw=wR} 产生式为 S → ε ∣ 0 ∣ 1 ∣ 0 S 0 ∣ 1 S 1 S \rightarrow \varepsilon\, |\, 0\, |\, 1\, |\, 0S0\, |\, 1S1 S→ε∣0∣1∣0S0∣1S1 两个语法分析树如下:
3. 二义性
对于一个CFG: G = ( { E , I } , { a , b , ( , ) , + , ∗ } , E , P ) G=(\{E,I\}, \{a, b, (, ), +, *\}, E, P) G=({ E,I},{ a,b,(,),+,∗},E,P),产生式为 E → I ∣ E + E ∣ E ∗ E ∣ ( E ) , I → a ∣ b E\rightarrow I\; |\; E+E |\;E*E\;|\;(E), I\rightarrow a\;|\;b E→I∣E+E∣E∗E∣(E),I→a∣b
对于字符串 w = a + a ∗ a w=a+a*a w=a+a∗a 的两种最左派生如下:
E ⇒ E ∗ E ⇒ E + E ∗ E ⇒ I + E ∗ E ⇒ a + E ∗ E ⇒ a + a ∗ a E ⇒ E + E ⇒ I + E ⇒ a + E ⇒ a + E ∗ E ⇒ a + a ∗ a E\Rightarrow E*E\Rightarrow E+E*E\Rightarrow I+E*E\Rightarrow a+E*E\Rightarrow a+a*a\\ E\Rightarrow E+E\Rightarrow I+E\Rightarrow a+E\Rightarrow a+E*E\Rightarrow 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
对应的语法分析树如下,发现一个先算的是加法,一个先算的是乘法,出现了歧义。
重新构造产生式以消除歧义:
先算乘法的: E → I ∣ E + E ∣ E ∗ E ∣ ( E ) , I → a ∣ b E\rightarrow I\; |\; E+E\; |\; E*E\; |\; (E),\; I\rightarrow a\; |\; b E→I∣E+E∣E∗E∣(E),I→a∣b
先算加法的: E → T ∣ E + T , T → F ∣ T ∗ F , F → I ∣ ( E ) , I → a ∣ b ∣ I a ∣ I b E\rightarrow T\; |\; E+T,\; T\rightarrow F\; |\; T*F,\; F\rightarrow I\; |\;(E),\; I\rightarrow a\;|\;b\;|\;Ia\;|\;Ib 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 → B C A\rightarrow BC A→BC, A , B , C ∈ V A,B,C\in V A,B,C∈V
- A → a A\rightarrow a A→a, a ∈ T a\in T a∈T
CFG可以转换为CNF的形式,如下例子。
例:将 S → A B a , A → a a b , B → A c S\rightarrow ABa , A\rightarrow aab , B \rightarrow Ac S→ABa,A→aab,B→Ac 转化为CNF的形式
解: S → A C , A → D E , B → A F , C → B D , D → a , F → c , E → D G , G → b S\rightarrow AC,A\rightarrow DE,B\rightarrow AF,C\rightarrow BD,D\rightarrow a,F\rightarrow c,E\rightarrow DG,G\rightarrow b S→AC,A→DE,B→AF,C→BD,D→a,F→c,E→DG,G→b
2. 下推自动机(PDA)
由于FA有局限性,可以识别 M = { 0 n 1 m ∣ n ≥ 0 , m ≥ 0 } M=\{0^n1^m | n \ge 0, m \ge 0 \} M={ 0n1m∣n≥0,m≥0},但不能识别 L = { 0 n 1 n ∣ n ≥ 0 } L=\{ 0^n1^n | n \ge 0 \} L={ 0n1n∣n≥0},所以有了PDA
1. 形式化定义
下推自动机(Pushdown Automata):PDA是一个七元组 P = ( Q , Σ , Γ , δ , q 0 , z 0 , F ) P=(Q,\,\Sigma,\,\Gamma,\,\delta,\,q_0,\,z_0,\,F) P=(Q,Σ,Γ,δ,q0,z0,F),其中,
- Q Q Q 是有限的状态集;
- Σ \Sigma Σ 是有限的输入字符集;