当前位置:文档之家› 编译原理-练习

编译原理-练习


---
②把每个子集看成一个状态,得到一个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
{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
定义2:假定I是M’的状态集的子集,定义 Ia =ε_CLOSURE(J) 其中,J是所有那些可从I中的某一状态结点出发经过 一条a弧而到达的状态结点的全体
例:有如下一个状态转换图 假定 I={1, 2},求Ia = ? 解: Ia =ε_CLOSURE(J) J = { 5, 4, 3 } 1 a 4 ε
0 1 1 3 3 5 5 7 7
1 2 2 4 4 6 6 ---
0 01 1 1Βιβλιοθήκη 02 01 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}
ε
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}
编译原理
——练习1
王金伟 计算机与信息工程学院 天津师范大学
练习1.1 基本概念
编译程序的结构 上下文无关文法的一些概念 词法分析 语法分析

自上而下 自下而上
1.填充下面编译程序总框图 源程序 ( 字符串)
词法分析器 表 格 管 理 语义分析和中间代码生成器 代码优化器 语法分析器 出 错
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 …
得到一个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}
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消去;
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}
所以{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} 不可再分
(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)
②把得到的每个集合看成一个状态,得到一张状态转换表, 该表的初态就是ε_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 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)分别确定化和最 少化
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
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) ;
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
相关主题