编译原理-练习
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
处
理
目标代码生成器
目标程序
练习1.2 词法分析
对于∑上的每一个正规式V,存在一个∑上的DFA M, 使得L(M) = L(V) 问题:如何由一个正规式V,构造一个DFA M 思路:分两步走 1.根据V,构造一个NFA M’,使得L(M’) = L(V) 2.将M’确定化,变为DFA M 第一步,在∑上构造一个NFA M’ (1)构造一个拓广的转换图
②把每个子集看成一个状态,得到一个DFA M, 且L(M) = L(M’)
I {X} {1, 2, 3} {2, 3} {2, 3, 4} {2, 3, 5} {2, 3, 4, Y} 0 1 2 3 4 5 I0 =ε_CLOSURE(J) -{2, 3} {2, 3} {2, 3, 5} {2, 3} {2, 3, 5} 2 2 4 2 4 I1 =ε_CLOSURE(J) {1, 2, 3} {2, 3, 4} {2, 3, 4} {2, 3, 4} {2, 3, 4, Y} {2, 3, 4} 1 3 3 3 5 3
{3,4}
{3,4} {6,7} {6,7}
{5,6,7}
{5,6,7} {8,9,Y} {8,9,Y}
4
5 6 7
s 0 1 2 3 4 5 6 7
5
5 7 7
0 1 1 3 3 5 5 7 7 1 2 2 4 4 6 6 ---
6
6
{8,9,Y}
{9,Y}
{9,Y}
{9,Y}
---
s 0 1 2 3 4 5 6 7
用子集法对M’进行确定化 ①构造一张表
0 X 1 1 ε 2 1
I
{X} {1, 2, 3} {2, 3} {2, 3, 4} {2, 3, 5} {2, 3, 4, Y}
-J={2} J={2}
J={1} J={2, 4} J={2, 4} J={2, 4} J={2, 4, Y} J={2, 4}
②把得到的每个集合看成一个状态,得到一张状态转换表, 该表的初态就是ε_CLOSURE(X),它的终态是那些含有终 态Y的子集,这样就得到一个DFA M 且L(M) = L(M’)
I ε_CLOSURE(X) 集合1 集合2 集合3 集合4 S 0 1 2 3 4 Ia =ε_CLOSURE(J) 集合1 集合3 集合4 集合2 … a 1 3 4 2 … Ib =ε_CLOSURE(J) 集合2 集合4 集合3 集合1 … b 2 4 3 1 …
{4,5}
{0,1} {2,3}
J={1} J={2}
所以, 最终把M分割为{0,1}, {2,3} , {4,5} , {6,7} ⑤用状态1代替状态0,把引向状态0的箭弧都引向状态1, 把0消去;
0 0 1 1 1 0 2 0 1 1 3 0 4 0 1 1 5 0 6 0 7 0
2 1 1 0 0
4 1 0 1 1 3 0 0
1 1 5 0
6 0 7 0
6 1 0 1 3 0 1 1 5 0 0 7 0
用状态7代替状态6,把引向状态6的箭弧都引向状 态7,把6消去;得到一个化简得DFA M
6 1 0 1 3 0 1 1 5 0 0 7 0
1 0
1
3 0
1
5 0
1
7 0
2.把(a)和(b)分别确定化和最 少化
1.构造下列正规式相应的DFA。 (1) 1(0|1)*101 (2) 0*10*10*10*
(1)
1(0|1)*101
X V Y
①
X
* 1(0|1)101
Y
V1 V2
i V1V2 k
i
j
k
②
X
1
1
* (0|1)
3
101
Y
X
1
1
* (0|1)
3
101
Y
③
i
V
*
k
i
ε
V
j
ε
k
(0|1) X 1 1 ε 2 ε 3 101 Y
定义2:假定I是M’的状态集的子集,定义 Ia =ε_CLOSURE(J) 其中,J是所有那些可从I中的某一状态结点出发经过 一条a弧而到达的状态结点的全体
例:有如下一个状态转换图 假定 I={1, 2},求Ia = ? 解: Ia =ε_CLOSURE(J) J = { 5, 4, 3 } 1 a 4 ε
0
(2)
0*10*10*10*
X V Y
①
X
i V1V2 k
0*10*10*10*
Y
V2
i
V1
j
k
②
X
0*
1
1
2
0*
4
1
5
0*
7
1
5555550
8
0*
Y
X
0*
1
1
2
0*
4
1
5
0*
7
1
5555550
8
0*
Y
③
i
V
*
k
i
ε
V
j
ε
k
0
0
0
0
X ε 0 ε 1 1 2 ε 3 ε 4 1 5 ε 6 ε 7 1 8ε 9ε Y
ε
3
1
4
0
5
1
Y
J={2, 5} J={2} J={2, 5}
I0 =ε_CLOSURE(J)
-{2, 3}
I1 =ε_CLOSURE(J)
{1, 2, 3} {2, 3, 4}
{2, 3}
{2, 3, 5} {2, 3} {2, 3, 5}
{2, 3, 4}
{2, 3, 4} {2, 3, 4,Y} {2, 3, 4}
I1 =ε_CLOSURE(J)
{2,3,4} {2,3,4} J={2} J={2} J={5} J={5} J={8} J={8}
{3,4}
{3,4} {6,7} {6,7}
{5,6,7}
{5,6,7} {8,9,Y} {8,9,Y}
{8,9,Y}
{9,Y}
{9,Y}
{9,Y}
J={9}
J={9}
(0|1) X 1 1 ε 2 ε 3 101 Y
④
i
V1|V2
j
i
V1 V2
j
0 X 1 1 ε 2 1 ε 3 101 Y
0 X 1 1 ε 2 1
i V1V2 k
ε
3
101
Y
⑤
i
V1
j
V2
k
0 X 1 1 ε 2 1 ε 3 1 4 0 5 1 Y
得到一个NFA M’ 且 L(M’) = L(V)
所以{0,1,2,3}可再分 看图,把{0,1,2,3}分割为{0,1}和{2,3}
J={1,3} J={2,4}
0 0
1 1 1 0
{2,3}
2 0
1 1 3 0
4 0
1 1 5 0
6 0 7 0
J={3} J={4}
④考察{2,3} 因为, {2,3}0 = {3} {2,3}1 = {4} 所以, {2,3} 不可再分 ⑤考察{0,1} 因为, {0,1}0 = {1} {0,1}1 = {2} 所以, {0,1} 不可再分
J={2} J={1,3}
J={2} J={3}
所以, 最终把M分割为{0}, {1,2} , {3} , {4} , {5} ⑥用状态2代替状态1,把引向状态1的箭弧都引向状态2, 把1消去,得到一个DFA M’
0 1 0 1 1 3 1 2 1 0 0 1 4 1 5 0
0 0 1 2 1 3 1 0 0 1 4 1 0 5
得到一个NFA M’ 且 L(M’) = L(V)
0
0
0
0
ε 1 ε ε 1 ε ε X 0 1 2 3 4 5 6 ε 7 1 8ε 9ε Y
I
{X,0,1} {0,1} {2,3,4} {3,4} {5,6,7} {6,7}
I0 =ε_CLOSURE(J)
{0,1} {0,1} J={0} J={0} J={3} J={3} J={6} J={6}
看图,把{0,1,2,3,4,5}分割为{0,1,2,3}和{4,5}
1
1
1 1 5 0
6 0 7 0
J={7}
Jபைடு நூலகம்{1,3,5} J={2,4,6}
0 0
1 1 1
2 0
1 1 3
4 0
1 1 5
6 0 7 0
J={5} J={6}
0 0 0 ④考察{4,5} 因为, {4,5}0 = {5} {4,5} {4,5}1 = {6} {6,7} 所以, {4,5} 不可再分 ⑤考察{0,1,2,3} 因为, {0,1,2,3}0 ={1,3} {0,1,2,3} {0,1,2,3}1 = {2,4} {0,1,2,3} {4,5} {6,7}
a 5
ε 6
ε
2
ε a
3 ε 8
ε_CLOSURE(J) = { 5, 6, 2, 4, Ia={5, 6, 2, 4, 7, 3, 8}
7 3, 8 }
7,
(2)用子集法把M’确定化 设 ∑ = {a,b} ① 构造一张表
I ε_CLOSURE(X) 集合1 集合2 集合3 集合4 Ia =ε_CLOSURE(J) 集合1 集合3 集合4 集合2 … Ib =ε_CLOSURE(J) 集合2 集合4 集合3 集合1 …
---
②把每个子集看成一个状态,得到一个DFA M, 且L(M) = L(M’)
I
{X,0,1} {0,1} {2,3,4} {3,4} {5,6,7} {6,7} 0 1 2 3
I0 =ε_CLOSURE(J)
{0,1} {0,1} 1 1 3 3
I1 =ε_CLOSURE(J)
{2,3,4} {2,3,4} 2 2 4 4
0 1 0 1 1 3 2 1 0 0 1 1 4 1 5 0
0
④考察{0,1,2} 因为, {0,1,2}0 = {2} {0,1,2} {0,1,2}1 = {1,3} {0,1,2} 所以, {0,1,2}必可再分 看图,把{0,1,2}分割为{0}, {1,2} ⑤考察{1,2} 因为, {1,2}0 = {2} {1,2} {1,2}1 = {3} {3} 所以{1,2}不可再分
X
V
Y
(2)使用分裂规则对V进行分裂,加进新结点,直到把 图转换成每条弧上标识为∑上的一个字符或ε
i V1V2 k
V1|V2
i
V1
j
V1 V2
V2
k
i
j
i
j
i
V*
k
i
ε
V
j
ε
k
最后得到一个NFA M’ 且L(M’) = L(V)
第二步,把M’确定化 (1)两个概念 定义1:假定I是M’的状态集的子集,定义I的ε闭包 ε_CLOSURE(I)为: (a)若q∈I,则q∈ε_CLOSURE(I) (b)若q∈I,那么从q出发经任意条ε弧而能到达的任 何状态q’都属于ε_CLOSURE(I) ;
编译原理
——练习1
王金伟 计算机与信息工程学院 天津师范大学
练习1.1 基本概念
编译程序的结构 上下文无关文法的一些概念 词法分析 语法分析
自上而下 自下而上
1.填充下面编译程序总框图 源程序 ( 字符串)
词法分析器 表 格 管 理 语义分析和中间代码生成器 代码优化器 语法分析器 出 错
s 0 1 2 3 4 5
0 -2 2 4 2 4
1 1 3 3 3 5 3
s
0 1 2 3 4 5
0
-2 2 4 2 4
1
1 3 3 3 5 3
0 1 0 1 1 3 1 2 1 0 0 1 4 1 5 0
0
把DFA M’进行化简
0 1 1
0 0 2 0 4
1 1 0 解: 0 1 ①把M状态集分为两组: 3 5 1 终态结点{5} 1 非终态结点{0,1,2,3,4} ②考察{0,1,2,3,4} J={2,4} 因为, {0,1,2,3,4}0 = {2,4} {0,1,2,3,4} {0,1,2,3,4}1 = {1,3,5} {0,1,2,3,4} J={1,3,5} 所以, {0,1,2,3,4}可再分,分成{0,1,2,3}和{4} ③考察{0,1,2, 3} 因为, {0,1,2,3}0 = {2,4} {0,1,2,3} J={2,4} 所以, {0,1,2,3}必可再分 看图,把{0,1,2,3}分割为{0,1,2}和{3}
1 1 3 0
4 0
1 1 5 0
6 0 7 0
用状态3代替状态2,把引向状态2的箭弧都引向状 态3,把2消去;
2 1 1 0 0
1 1 3 0
4 0
1 1 5 0
6 0 7 0
4 1 0 1 1 3 0 0
1 1 5 0
6 0 7 0
用状态5代替状态4,把引向状态4的箭弧都引向状 态5,把4消去;
0 1 1 3 3 5 5 7 7
1 2 2 4 4 6 6 ---
0 0
1 1 1 0
2 0
1 1 3 0
4 0
1 1 5 0
6 0 7 0
4 2 (3) 例:把DFA M’进行化简 0 1 1 解: 0 0 0 3 1 ①把M状态集分为两组: 终态结点{6,7} 0 0 非终态结点{0,1,2,3,4,5} ②考察{6,7} 因为, {6,7}0 = {7} {6,7} {6,7}1 = { } {6,7} 所以, {6,7}不可再分; ③考察{0,1,2,3,4,5} 因为, {0,1,2,3,4,5}0 = {1,3,5} {0,1,2,3,4,5} {0,1,2,3,4,5}1 ={2,4,6} {0,1,2,3,4,5}