编译原理速成
上下文无关文法 & 语法分析树
上下文无关文法的四个要素
- 一组终结符(常用小写字母表示)
- 一组非终结符(常用大写字母表示)
- 一个开始符号(也是非终结符)
- 一组产生式 ( s o m e t h i n g → s o m e t h i n g something \rightarrow something something→something)
语法分析树
对于各元素,对于各非终结符,选择合适的产生式进行展开
有下列语法:
- E → E + E E \rightarrow E+E E→E+E
- E → E ∗ E E\rightarrow E * E E→E∗E
- E → ( E ) E \rightarrow (E) E→(E)
- E → i E \rightarrow i E→i
有如下产生式: ( i ∗ i + i ) (i * i + i) (i∗i+i)
步骤如下:
-
选择产生式 2
-
选择产生式 0
-
选择产生式 1,3
-
使用产生式 3
短语、直接短语、句柄、素短语
短语
同一个双亲节点的叶子节点
如 E 2 E_2 E2 的短语 E 4 ∗ i E_4 * i E4∗i, E 4 E_4 E4 的短语 i i i
直接短语
双亲结点的叶子结点在同一层
对于这棵子树, E 5 E_5 E5 有直接短语 i i i, E 4 E_4 E4 有直接短语 E 6 E_6 E6
句柄
最下层,最左侧的直接短语
句柄是 E 4 E_4 E4 的后继结点 E 6 E_6 E6
素短语
- 至少一个终结符
- 不包含其他素短语
故有素短语 i i i
最左素短语
i i i
是否为二义性文法
即判定 L ( G ) L(G) L(G) 中是否存在句子不止对应一个最左 / 最右推导
无二义性文法中,产生的每个句子只能对应一颗语法树
仍然对应上段文法,有同样正确的语法树
说明此文法具有二义性
最左与最右推导
最左推导
每次替换时
- 从左侧开始寻找非终结符
- 每次利用一个产生式,对一个终结符进行替换
- 到没有终结符为止
E → ( E ) → ( E ∗ E ) → ( i ∗ E ) → ( i ∗ E + E ) → ( i ∗ i + E ) → ( i ∗ i + E ) E \rightarrow (E) \rightarrow (E*E)\rightarrow (i*E)\rightarrow (i*E+E) \rightarrow (i*i+E) \rightarrow (i*i+E) E→(E)→(E∗E)→(i∗E)→(i∗E+E)→(i∗i+E)→(i∗i+E)
最右推导
每次替换时
- 从右侧开始寻找非终结符
- 每次利用一个产生式,对一个终结符进行替换
- 到没有终结符为止
E → ( E ) → ( E + E ) → ( E + i ) → ( E ∗ E + i ) → ( E ∗ i + i ) → ( i ∗ i + i ) E \rightarrow (E) \rightarrow(E+E) \rightarrow (E+i) \rightarrow (E*E+i) \rightarrow (E*i + i) \rightarrow (i*i+i) E→(E)→(E+E)→(E+i)→(E∗E+i)→(E∗i+i)→(i∗i+i)
化简文法
- 由 S S S 开始,删除永远消不掉的符号
- 删除推空 A → ϵ A \rightarrow \epsilon A→ϵ
- 删除非终结符推非终结符 A → B A \rightarrow B A→B
状态转换图
状态转换图基本形态
状态1时候是情况 i
,则
→
2
\rightarrow 2
→2
状态1时候是情况 j
,则
→
3
\rightarrow 3
→3
DFA 与 NFA
DFA 确定有穷自动机
五元式 M = { S , ϵ , δ , S 0 , F } M = \{S,\epsilon,\delta,S_0,F\} M={S,ϵ,δ,S0,F}
紫皮《编译原理》使用的是 M = { K , ∑ , f , S , Z } M = \{K,\sum,f,S,Z\} M={K,∑,f,S,Z},trivial
S S S:状态的集合(如上图中的 1 , 2 , 3 1,2,3 1,2,3 )
ϵ \epsilon ϵ:有穷字符集(如上图中的 i , j i,j i,j)
δ \delta δ:映射,即跳转时选择分支的规则
S 0 S_0 S0:初始状态(即上图中的 1),可以为空
F F F:最终状态(即上图中的 2 , 3 2,3 2,3)
NFA 不确定有穷自动机
初始状态 $S_0 $ 不能为空,其他同 DFA
构造正规式系统
规则
以右递归的方式,运用三个裂解规则
-
规则
1
对于
有
-
规则
2
对于
有
-
规则
3
对于
有
构造正规式相应的转换系统
构造下列正规式 ( 0 ∣ 11 ∗ 0 ) ∗ (0|11*0)* (0∣11∗0)∗ 对应的转换系统
运用规则 3
运用规则 2
运用规则 1
运用规则3
运用规则 1
状态转换矩阵
DFA 的状态转移矩阵
见紫皮《编译原理》P48 图 3.3 同理
有状态转移矩阵
a | b | |
---|---|---|
0 | 1 | 2 |
1 | 3 | 2 |
2 | 1 | 3 |
3 | 3 | 3 |
NFA 的状态转移矩阵
其状态转移矩阵包括 3 3 3 类集合
-
对于 I I I
- 对于初始状态:经过任意个 ϵ \epsilon ϵ 时转化得到的状态 I I I
- 对于非初始状态:前面的推导中出现的新的状态集(没出现过的 I a , I b Ia,I_b Ia,Ib)
-
对于 I a I_a Ia
经过
-
一个 a a a+ (跟着)任意个 ϵ \epsilon ϵ
-
任意个 ϵ \epsilon ϵ
时转化得到的状态 I a I_a Ia
-
-
对于 I b I_b Ib
经过
-
一个 b b b+ (跟着)任意个 ϵ \epsilon ϵ
-
任意个 ϵ \epsilon ϵ
时转化得到的状态 I a I_a Ia
-
写到不再有新的状态集可以加入 X
为止
-
I I I I a I_a Ia I b I_b Ib { X , 5 , 1 } \{X,5,1\} {X,5,1} { 5 , 3 , 1 } \{5,3,1\} {5,3,1} { 5 , 4 , 1 } \{5,4,1\} {5,4,1} - 初始状态
x
, X ⟶ ϵ 5 X\stackrel{\epsilon}{\longrightarrow}5 X⟶ϵ5, 5 ⟶ ϵ 1 5\stackrel{\epsilon}{\longrightarrow}1 5⟶ϵ1,即 I = { X , 5 , 1 } I = \{X,5,1\} I={X,5,1} - 对于 I I I 中的每一个元素 5 ⟶ a 5 5\stackrel{a}{\longrightarrow}5 5⟶a5,, 5 ⟶ ϵ 1 5\stackrel{\epsilon}{\longrightarrow}1 5⟶ϵ1, 1 ⟶ a 3 1\stackrel{a}{\longrightarrow}3 1⟶a3,即 I a = { 5 , 3 , 1 } I_a = \{5,3,1\} Ia={5,3,1}
- 对于 I I I 中的每一个元素,有 5 ⟶ b 5 5\stackrel{b}{\longrightarrow}5 5⟶b5, 5 ⟶ ϵ 1 5\stackrel{\epsilon}{\longrightarrow}1 5⟶ϵ1, 1 ⟶ b 4 1\stackrel{b}{\longrightarrow}4 1⟶b4,即 I b = { 5 , 4 , 1 } I_b = \{5,4,1\} Ib={5,4,1}
- 初始状态
-
I I I I a I_a Ia I b I_b Ib { 5 , 3 , 1 } \{5,3,1\} {5,3,1} { 5 , 3 , 1 , 2 , 6 , Y } \{5,3,1,2,6,Y\} {5,3,1,2,6,Y} { 5 , 4 , 1 } \{5,4,1\} {5,4,1} - 加入新状态 I = { 5 , 3 , 1 } I = \{5,3,1\} I={5,3,1}
- 对于 I I I 中的每一个元素,有 5 ⟶ a 5 5\stackrel{a}{\longrightarrow}5 5⟶a5, 5 ⟶ ϵ 1 5\stackrel{\epsilon}{\longrightarrow}1 5⟶ϵ1, 3 ⟶ a 2 3\stackrel{a}{\longrightarrow}2 3⟶a2, 3 ⟶ a 2 ⟶ ϵ 6 3\stackrel{a}{\longrightarrow}2\stackrel{\epsilon}{\longrightarrow}6 3⟶a2⟶ϵ6, 3 ⟶ a 2 ⟶ ϵ 6 ⟶ ϵ Y 3\stackrel{a}{\longrightarrow}2\stackrel{\epsilon}{\longrightarrow}6\stackrel{\epsilon}{\longrightarrow}Y 3⟶a2⟶ϵ6⟶ϵY, 1 ⟶ a 3 1\stackrel{a}{\longrightarrow}3 1⟶a3,即 I a = { 5 , 1 , 2 , 6 , Y , 3 } I_a = \{5,1,2,6,Y,3\} Ia={5,1,2,6,Y,3}
- 对于 I I I 中的每一个元素,有 5 ⟶ b 5 5\stackrel{b}{\longrightarrow}5 5⟶b5, 5 ⟶ ϵ 1 5\stackrel{\epsilon}{\longrightarrow}1 5⟶ϵ1, 1 ⟶ ϵ 4 1\stackrel{\epsilon}{\longrightarrow}4 1⟶ϵ4
-
加入新状态 I = { 5 , 4 , 1 } I = \{5,4,1\} I={5,4,1}
-
加入新状态 I = { 5 , 3 , 1 , 2 , 6 , Y } I = \{5,3,1,2,6,Y\} I={5,3,1,2,6,Y}
-
加入新状态 I = { 5 , 4 , 1 , 6 , Y } I = \{5,4,1,6,Y\} I={5,4,1,6,Y}
-
加入新状态 I = { 5 , 4 , 1 , 2 , 6 , Y } I = \{5,4,1,2,6,Y\} I={5,4,1,2,6,Y}
-
加入新状态 I = { 5 , 3 , 1 , 6 , Y } I = \{5,3,1,6,Y\} I={5,3,1,6,Y}
NFA 转化为 DFA
将 NFA 中的状态转移矩阵标号
- I I I 列记作 $0\sim 6 $
- I a , I B I_a,I_B Ia,IB 根据 I I I 的标记写出
此时这个 NFA 的状态转移矩阵已经构成了一个新的 DFA