编译原理课后习题答案Word文档格式.docx
《编译原理课后习题答案Word文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理课后习题答案Word文档格式.docx(40页珍藏版)》请在冰豆网上搜索。
⑷(0|1)*111
2.⑴试写出非负整数集的正则表达式。
⑵试写出以非5数字为头的所有非负整数集的正则表达式。
⑴0|(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*
⑵0|(1|2|3|4|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*
3.试将2.8中所示的有限状态自动机M最小化。
分析:
只能对确定的有限状态自动机进行最小化,本题的自动机已经是确定的。
最小化采用状态分离法,具体做法如下:
①进行0等价类的划分:
Q划分为Qf与Q-Qf
②若已进行了k等价划分,即Q已被划分成(Q1,Q2,…Qn),再进行k+1划分,对Qi(i=1…n),若q、q’∈Qi,使得对某一个a∈VT,δ(q,a)∈Qj和δ(q’,a)∈Ql,j≠l或δ(q,a)存在而δ(q’,a)不存在或反之。
则将Qi划分为二个子集Qi1,Qi2,使q∈Qi1,q’∈Qi2。
③重复②直至无法进一步划分为止。
对最后划分得到的状态子集中每一个子集,选择该子集中任何一个状态作为该状态子集的代表,然后修改原来的有限状态自动机的状态转换函数δ,凡在δ作用下转向某状态子集中任何一个状态的一律改成转向该状态子集的代表。
若一个状态子集中某一状态是原来的开始状态,则该状态子集的代表就是新的有限状态自动机的开始状态。
同理,若一个状态子集中的状态均是最终状态,则该状态子集的代表就是新的有限状态自动机的最终状态。
④抹去可能存在的无用状态与不可及状态。
此有限状态自动机的状态转换表如表3.1所示:
表2.1M的状态转换表
a
b
⊥
A
B
C
D
E
F
Accept
G
由此看出:
此有限状态自动机是确定的。
最小化:
初始划分由2个子集组成,即:
({A,B,C},{D,E,F,G})
集合{D,E,F,G}不需要进一步划分,考察子集{A,B,C}。
由于
δ(B,a)=D∈{D,E,F,G},而δ(A,a)=δ(C,a)=B∈{A,BC},
因此Q可进一步划分为:
({A,C},{B},{D,E,F,G})。
δ(A,b)=C∈{A,C},而δ(C,b)=E∈{D,E,F,G}。
({A},{C},{B},{D,E,F,G})。
这时不能再划分了,得到的最小化的有限状态自动机如表3.2所示:
表2.2最小化的有限状态自动机
4.某程序语言的无(正负)符号常数可以用下面正则表达式R来表示:
(D+E|D+.D+E|E|.D+E)((+|-)D|D)D*|D+|D*.D+
⑴试把它转换成确定性有限状态自动机。
⑵把上述有限状态自动机最小化。
⑶在上述有限状态自动机中添加相应动作,取出无(正负)符号常数。
从正则表达式构造有限状态自动机可以分两步进行。
①画一条从结点X到结点Y的有向弧,有向弧上标以正则表达式R。
结点X为标以“-”的初始状态,结点Y为标以“+”的最终状态。
从这一有向图出发反复应用图3.2所示的替代规则,直至所有有向弧都以VT中的符号或标记ε为止。
图2.23条替代规则
②消除应用①所得到的传递图中的ε弧,可以分为两步:
首先消除ε环路,其次消除其他ε弧。
a)ε环路的消除方法:
i.将ε环路的诸项合并为一个顶点。
ii.修改各个相关的有向弧。
iii.若ε环路中某一状态是最终(或初始)状态,则新顶点是最终(或初始)状态。
b)其它ε弧的消除有两种方法:
1)子集法:
即计算ε-Closure(T),其表示从状态集T中任何一状态沿ε弧可以到达的状态全体。
其要点是:
从初始状态q0的X=ε-Closure(q0)开始,按如下方法构造状态集:
i.令Set={X};
ii.若Set中还有未考察过的状态子集Xi,则对于每一输入符号aVT,求T=ε-Closure(move(Xi,a)),Set=Set∪{T}(其中move(Xi,a)={q|qδ(p,a),pXi})。
重复执行
(2),直至不存在这样的Xi。
这样得到的Set即为消除ε弧后的确定的有限状态机(DFA)。
DFA的初始状态就是ε-Closure(q0),最终状态由那些至少含有一个最终状态的状态子集组成。
2)逐步消除法:
其要点是找到类似于图2.3所示,但从B再无ε弧引出的ε弧。
图2.3逐步消除法
删除状态A到状态B的ε弧,对每一条从状态B到状态C标记为ai的弧,增加1条从状态A到状态C标记为ai的弧。
若B是最终状态,则让A为最终状态。
重复上述过程直至消除全部的ε弧,这样得到的一般是不确定的有限状态自动机(NFA)。
⑴图3.4给出了从正则表达式R构造有限状态自动机M的过程。
图2.4替代规则的应用过程
应用子集法消除?
弧:
ε-Closure(x)={x,2},令A1={x,2},计算:
ε-Closure(move(A1,D))=ε-Closure({7,10,2,1})={7,10,2,1,y}
ε-Closure(move(A1,·
))=ε-Closure({5,3})={5,3}
ε-Closure(move(A1,E))=ε-Closure({4})={4}
令A2={7,10,2,1,y},A3={5,3},A4={4},计算:
ε-Closure(move(A2,D))={7,10,2,1,y}
ε-Closure(move(A2,·
))={8,3}
ε-Closure(move(A2,E))={4}
ε-Closure(move(A3,D))={5,6,3,y}
ε-Closure(move(A4,D))={12,y}
ε-Closure(move(A4,+))={11}
ε-Closure(move(A4,-))={11}
令A5={8,3},A6={5,6,3,y},A7={12,y},A8={11},计算:
ε-Closure(move(A5,D)={8,9,3,y}
ε-Closure(move(A6,D)={5,6,3,y}
ε-Closure(move(A6,E)={4}
ε-Closure(move(A7,D)={12,y}
ε-Closure(move(A8,D)={12,y}
令A9={8,9,3,y},计算:
ε-Closure(move(A9,D)={8,9,3,y}
ε-Closure(move(A9,E)={4}
得到的DFAM’的初始状态是A1,最终状态集由A2,A6,A7,A9组成。
图2.5是M’的状态转换图,M’的状态转换表如表2.3所示。
表2.3M’的状态转换表
·
+
-
A1
A2
A4
A3
A5
A6
A7
A8
A9
图2.5M’的状态转换图
⑵采用状态分离法:
初始时分成2个子集,即:
({A1,A3,A4,A5,A8},{A2,A6,A7,A9})
考察子集{A2,A6,A7,A9},它进一步可分成:
({A6,A9},{A2},{A7})
考察子集{A1,A3,A4,A5,A8},它进一步分成:
({A4},{A1},{A8},{A3,A5})
不能再进一步划分了,得到的最小化的有限状态自动机如图2.6所示:
图2.6最小化的有限状态自动机
⑶由于数的表示和具体的机器有着内在联系,这里仅将此无(正负)符号常数的十进制数部分和指数部分分别存入2个工作单元。
设立下述工作单元:
此常数的十进制数部分
number
此常数的指数部分
exp
小数点位数
n
此常数指数部分正负号
expsign
这4个工作单元进入有限状态自动机的模拟程序时被初始化为0。
函数过程getchar,其功能是读入下一个字符到工作单元char中。
函数过程value,其功能是求出存放在工作单元char中数字字符的值。
经过加工后的状态矩阵如表2.4所示:
表2.4加工后的状态矩阵
#1,A2
#2,A3
#2,A4
#3,A2
#10,Accept
#4,A6
#5,A7
#6,A8
#7,A8
#11,Accept
#8,A7
#12,Accept
#9,A7
矩阵中元素A1,A2,….,A7表示应该转换的下一个状态。
#1,#2,….,#12表示应该执行的语义子程序。
各语义子程序的代码归结如下:
#1:
number:
=value(char);
getchar;
#2:
#3:
=number*10+value(char);
#4:
n:
=n+1;
number:
#5:
expsign:
=1;
exp:
#6:
#7:
expsign=-1;
#8:
=exp*10+value(char);
#9:
#10:
按硬件要求构造无(正负)符号数;
#11:
=-n;
按硬件要求构造无(正负)符号数;
#12:
ifexpsign=-1thenexp:
=-exp;
exp=exp-n;
5.设要识别的单词有限集是{STEP,SWITCH,STRING},相应正则表达式是STEP|SWITCH|STRING,试把它转换成确定性有限状态自动机。
6.设VT={a,b},试构造下述正则表达式的确定性有限状态自动机:
⑴a(a|b)*baa
⑵(a|b)*bbb*
⑴由此正则表达式构造的有限状态自动机M1的状态转换图如图2.7所示:
图2.7有限状态自动机M1的转换图
确定化(表3.5):
表3.5M1的确定化
Q’
δa’
δb’
[1]
[2]
[2,3]
[2,4]
[2,5]
对应的状态转换图如图3.8所示:
图2.8DFAM1的状态转换图
⑵由正则表达式构造的有限状态自动机M2的状态转换图如图2.9所示:
图2.9M2的状态图
确定化(表2.6):
表2.6M2的确定化
[1,2]
[1,2,3]
对应的状态转换图如图2.10所示:
图2.10DFAM2的状态转换图
9.对于下列的状态转换矩阵:
S
S
Z
⑴分别画出相应的状态转换图。
⑵用自然语言分别描述它们所识别的输入串的特征。
⑴表1所对应的状态转换图如图2.11所示:
图2.11表3.6对应的状态转换图
表2所对应的状态转换图如图2.12所示:
图2.12表3.7对应的状态转换图
⑵表1所识别的输入串是:
以b*aa*b开头的后接任意多个a或b的{a,b}上的字符串。
表2所识别的输入串是:
仅含有一个a的{a,b}上的字符串。
10.将习题图2.1所示的非确定的有限状态自动机确定化和最小化。
习题图2.1非确定的有限状态自动机M
确定化(表2.8):
表2.8M的确定化
[S]
[A]
[B,C]
令B=[B,C]对应的状态转换图如图2.14所示:
图2.14DFAM的状态转换图
确定化的M已是最小化的。
11.消除传递图T(习题图2.2)中的弧。
习题图2.2传递图T
i)先消除ε环路,合并状态2和3,得到的传递图T’如图3.16所示:
图2.16消除?
环路的传递图T’
ii)采用逐步消除法去除其他ε弧,最终得到的传递图T’’如图2.17所示:
图2.17消除所有ε弧的传递图
Chapter3
2.设有文法G1[<
S>
]:
<
→<
N>
D>
|<
D→0|1|2|…|9
试写出028和4321的最左推导和最右推导过程。
在每一步的推导中,都是对最左的那个非终结符用相应的产生式的右部来替换,这样的推导称为最左推导。
类似地,如果每一步的推导中都是对最右的那个非终结符用相应的产生式的右部来替换,这样的推导称为最右推导,最右推导又称规范推导。
028的最左推导:
⇒<
⇒0<
⇒02<
⇒028
028的最右推导:
8⇒<
28⇒<
28⇒028
4321的最左推导:
⇒4<
⇒43<
⇒432<
⇒4321
4321的最右推导:
1⇒<
21⇒<
321⇒<
321⇒4321
3.证明文法G[<
]是二义性文法:
→if<
E>
then<
else<
|if<
|s
→0|1
只要找出该文法的一个二义性句子即可证明。
句子if0thenif1thenselses对应如下两棵不同的推导树:
图3.1句子if0thenif1thenselses的推导树
(1)
图3.1句子if0thenif1thenselses的推导树
(2)
4.设有文法G[<
-<
T>
/<
F>
→i|(<
)
⑴试写出i/(i-i-i)的推导树。
⑵试写出(<
-i)/<
的短语、简单短语和句柄。
只要给出句型(句子)对应的推导树就容易求出短语、简单短语和句柄。
⑴i/(i-i-i)的推导树如下:
图3.3句子i/(i-i-i)的推导树
⑵(<
的推导树如下:
图3.4句子(<
的推导树
短语:
,i,<
-i,(<
-i),(<
简单短语:
,i
句柄:
5.对布尔矩阵
求B+。
利用Warshall算法求解的结果如下:
7.对表结构语言G[<
→a|∧|(<
<
⑴试给出(a,(a,a))的最左和最右推导。
⑵指出(((a,a),∧,(a)),a)的最右推导,以及规约的每一步的句柄。
⑶给出(((a,a),∧,(a)),a)的推导树自下而上的构造过程。
本题是要让读者明确,自下而上构造推导树的过程是最右推导(规范推导)的逆过程,这一过程正是自底向上句法分析的过程,其要点是找句柄、归约。
⑴句子(a,(a,a))的最左推导为:
(<
)(<
)(a,<
)(a,(<
))(a,(<
)(a,(a,<
)(a,(a,a))
最右推导为:
(<
))(<
a))(<
(a,a))(<
(a,a))(a,(a,a))
⑵句子(((a,a),,(a)),a)的最右推导及归约的每一步句柄如表3.1所示:
表3.1句子(((a,a),,(a)),a)的最右推导过程
最右推导
每一步归约时的句柄
((<
(<
a)
a)
(((<
),a)
)),a)
(a)),a)
∧,(a)),a)
∧
((((<
),∧,(a)),a)
a),∧,(a)),a)
((((a,a),∧,(a)),a)
⑶句子(((a,a),,(a)),a)的推导树如图3.5所示:
图3.5句子(((a,a),∧,(a)),a)的推导树
构造过程如图3.6所示:
图3.6句子(((a,a),,(a)),a)的推导树自下而上的构造过程
Chapter4(略)
Chapter5
1.考察算术表达式翻译文法T1:
T1=({+,*,(,),C},{<
P>
},{C,ADD,MUL},R,<
其中R由下面规则组成:
+<
ADD
*<
MUL
→(<
),<
→C,C
其相应输入文法是LR
(1)。
试对该输入文法的下推自动机控制表作适当改动,构造翻译下推自动机的控制表,使该翻译下推自动机把任何一个由C,+,*组成的中缀表达式翻译成后缀表达式。
设翻译文法中的翻译规则形如:
A>
→x,y
把自底向上的下推自动机改造成相应的下推翻译自动机的方法很简单:
只需规定,当下推自动机应用产生式i进行规约的同时,输出y中的输出符号。
输入文法的LR
(1)状态集如表5.1。
表5.1输入文法的LR
(1)状态集
状态T
项目集
文法符号B
GOTO(T,B)
*[<
E’>
→·
⊥,∧]
1
[<
⊥/+]
2