编译原理期末速成一
编译原理速成
上下文无关文法 & 语法分析树
上下文无关文法的四个要素
- 一组终结符(常用小写字母表示)
- 一组非终结符(常用大写字母表示)
- 一个开始符号(也是非终结符)
- 一组产生式 ( 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?a?5,, 5 ? ? 1 5\stackrel{\epsilon}{\longrightarrow}1 5???1, 1 ? a 3 1\stackrel{a}{\longrightarrow}3 1?a?3,即 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?b?5, 5 ? ? 1 5\stackrel{\epsilon}{\longrightarrow}1 5???1, 1 ? b 4 1\stackrel{b}{\longrightarrow}4 1?b?4,即 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?a?5, 5 ? ? 1 5\stackrel{\epsilon}{\longrightarrow}1 5???1, 3 ? a 2 3\stackrel{a}{\longrightarrow}2 3?a?2, 3 ? a 2 ? ? 6 3\stackrel{a}{\longrightarrow}2\stackrel{\epsilon}{\longrightarrow}6 3?a?2???6, 3 ? a 2 ? ? 6 ? ? Y 3\stackrel{a}{\longrightarrow}2\stackrel{\epsilon}{\longrightarrow}6\stackrel{\epsilon}{\longrightarrow}Y 3?a?2???6???Y, 1 ? a 3 1\stackrel{a}{\longrightarrow}3 1?a?3,即 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?b?5, 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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!