1、第 2 章参考答案:1,2,3:解答:略!4. 解答:A: B: C: D: 5. 解答:用 E 表示 ,T 表示 ,F 表示,上述文法可以写为:E T | E+TT F | T*FF (E) | i最左推导:E=E+T=E+T+T=T+T+T=F+T+T=i+T+T=i+F+T=i+i+T=i+i+F=i+i+iE=E+T=T+T=F+T=i+T=i+T*F=i+F*F=i+i*F=i+i*i最右推导:E=E+T=E+F=E+i=E+T+i=E+F+i=E+i+i=T+i+i=F+i+i=i+i+iE=E+T=E+T*F=E+T*i=E+F*i=E+i*i=T+i*i=F+i*i =i+i*
2、ii+i+i 和 i+i*i 的语法树如下图所示。i+i+i、i+i*i 的语法树6. 解答:(1) 终结符号为:or,and,not,(,),true,false非终结符号为:bexpr,bterm,bfactor开始符号为:bexpr(2) 句子 not(true or false)的语法树为:7. 解答:(1) 把 anbnci 分成 anbn 和 ci 两部分,分别由两个非终结符号生成,因此,生成此文法的产生式为:S ABA aAb|abB cB|(2) 令 S 为开始符号,产生的 w 中 a 的个数恰好比 b 多一个,令 E 为一个非终结符号,产生含相同个数的 a 和 b 的所有串,
3、则产生式如下: S aE|Ea|bSS|SbS|SSbE aEbE|bEaE|(3) 设文法开始符号为 S,产生的 w 中满足|a| |b| 2|a|。因此,可想到 S 有如下的产生式 (其中 B 产生 1 到 2 个 b): S aSBS|BSaSB b|bb(4) 解法一:S 奇数头 整数 奇数尾| 奇数头 奇数尾| 奇数尾 奇数尾 1|3|5|7|9奇数头 2|4|6|8| 奇数尾 整数 整数 数字|数字数字 0|奇数头解法二:文法 G=(S,A,B,C,D,0,1,2,3,4,5,6,7,8,9,P,S)SAB | BAAC | DB1|3|5|7|9D2|4|6|8|BC0|D(5)
4、 文法 G=(N,S,N,M,D,0,1,2,3,4,5,6,7,8,9 ,S,P)SN0 | N5NMD|M1|2|3|4|5|6|7|8|9DD0 | DM |(6) GS:SaSa | bSb | cSc | a | b | c |8. 解答:(1) 句子 abab 有如下两个不同的最左推导:S = aSbS = abS =abaSbS = ababS = ababS = aSbS = abSaSbS = abaSbS = ababS = abab所以此文法是二义性的。(2) 句子 abab 的两个相应的最右推导:S = aSbS = aSbaSbS = aSbaSb = aSbab =
5、 ababS = aSbS = aSb = abSaSb = abSab = abab(3) 句子 abab 的两棵分析树: (a) (b)(4) 此文法产生的语言是:在a,b上由相同个数的 a 和 b 组成的字符串。9,10:解答:略!第 3 章习题解答:1. 解答:(1) (2) (3) (4) (5) (6) 2. 分析有限自动机分为确定有限自动机和非确定有限自动机。确定有限自动机的确定性表现在映射:QV T q 是单值函数,也就是说,对任何状态 qQ 和输入字符串 aV T, (q,a)唯一确定下一个状态。显然,本题给出的是一个确定的有限自动机,它的状态转换图是 C 中的。它所接受的语
6、言可以用正则表达式表示为 00(0|1)*,表示的含义为由两个 0 开始的后跟任意个(包含 0 个)0 或 1 组成的符号串的集合。 2. 解答:A: B: C: D: E: 3,4解答:略!5解答:6解答:(1) (0|1)*01(2) (1|2|9)(0|1|2|9)*| )(0|5)(3) (0|1)*(011)(0|1)*(4) 1*|1*0(0|10)*(1|) (5) a*b*c*z*(6) (0|10*1)*1(7) (00|11)*(01|10)(00|11)*(01|10)(00|11)*)*(8) 分析 设 S 是符合要求的串,|S|=2k+1 (k0) 。则 SS 10|
7、S21,|S 1|=2k (k0) ,|S 2|=2k (k0) 。且 S1是0,1上的串,含有奇数个 0 和奇数个 1。S2是0,1上的串,含有偶数个 0 和偶数个 1。考虑有一个自动机 M1接受 S1,那么自动机 M1如下:和 L(M1)等价的正规式,即 S1为:(00|11)|(01|10)(00|11)*(01|10)*(01|10)(00|11)*类似的考虑有一个自动机 M2接受 S2,那么自动机 M2如下:和 L(M2)等价的正规式,即 S2为:(00|11)|(01|10)(00|11)*(01|10)*因此,S 为:(00|11)|(01|10)(00|11)*(01|10)*
8、(01|10)(00|11)*0|(00|11)|(01|10)(00|11)*(01|10)*17解答:(1) 以 0 开头并且以 0 结尾的,由 0 和 1 组成的符号串。(2) |0,1 *(3) 由 0 和 1 组成的符号串,且从右边开始数第 3 位为 0。(4) 含 3 个 1 的由 0 和 1 组成的符号串。 |0,1 +,且 中含有 3 个 1 (5) 包含偶数个 0 和 1 的二进制串,即 |0,1 *,且 中有偶数个 0 和 1 8. 解答:0 1Q0*Q1Q2Q3Q2Q3Q0Q1Q1Q0Q3Q29. 解答:(1) DFA M=(0,1,q 0,q 1,q 2,q 0,q 2
9、, )其中定义如下: (q0,0)=q 1 (q0,1)=q 0 (q1,0)=q 2 (q1,1)=q 0 (q2,0)=q 2 (q2,1)=q 0状态转换图为:(2) 正规式: 1 *01*01*01* DFA M=(0,1,q 0,q 1,q 2,q 3,q 0,q 3,) ,其中 定义如下: (q0,0)=q 1 (q0,1)=q 0 (q1,0)=q 2 (q1,1)=q 1 (q2,0)=q 3 (q2,1)=q 2 (q3,1)=q 3 状态转换图为:10. 解答:(1) DFA M=(0,1,q 0,q 1,q 2,q 3,q 0,q 3, ),其中定义如下: (q0,0)=
10、q 1 (q0,1)=q 2 (q1,0)=q 1 (q1,1)=q 3 (q2,0)=q 3 (q2,1)=q 1状态转换图为:(2) DFA M=(0,1,q 0,q 0,q 0, ),其中定义如下: (q0,0)=q 0 (q0,1)=q 0状态转换图为:11 解答:(1) (a|b)*a(a|b) 求出 NFA M:确定化,得到 DFA M:化简: 在第步中求出的 DFA M 中没有等价状态,因此它就是最小化的 DFA M。(2) (a)b)*a(a|b)(a|b) 求 NFA M: 确定化,得到 DFA M:化简,在第步中求出的 DFA M 中没有等价状态,因此它已经是最小化的 DF
11、A M了。12.解答:对应的 NFA 为:增加状态 X、Y,再确定化:I Ia Ibx,5 A,T,Y A,T,Y A,T,Y BB B,T,YB,T,Y T,YT,Y 得到的 DFA 为:最小化:该自动机已经是最小化的 DFA 了。13解答:其中 a 代表 1 元硬币,b 代表 5 角硬币14解答:正规式为:(0|1) *(00|01) 化简:(0|1) *0(0|1)不确定的有穷自动机为:确定化,并最小化得到:正规文法为:S1S | 0AA0B | 0 | 1C | 1B0B | 0 | 1C | 1C1S | 0A15.解答: 正规式: (dd*:| )dd*(.dd*| ),d 代表
12、az 的字母 NFA 为: DFA 为:16.解答:词法分析器对源程序采取非常局部的观点,因此象 C 语言的语句fi (a = f (x) ) 中,词法分析器把 fi 当作一个普通的标识符交给编译的后续阶段,而不会把它看成是关键字 if 的拼写错。PASCAL 语言要求作为实型常量的小数点后面必须有数字,如果程序中出现小数点后面没有数字情况,它由词法分析器报错。17. 解答:此时编译器认为/* then part return qelse/* else part */是程序的注释,因此它不可能再发现 else 前面的语法错误。分析 这是注释用配对括号表示时的一个问题。注释是在词法分析时忽略的,
13、而词法分析器对程序采取非常局部的观点。当进入第一个注释后,词法分析器忽略输入符号,一直到出现注释的右括号为止,由于第一个注释缺少右括号,所以词法分析器在读到第二个注释的右括号时,才认为第一个注释处理结束。为克服这个问题,后来的语言一般都不用配对括号来表示注释。例如 Ada 语言的注释始于双连字符(-) ,随行的结束而终止。如果用 Ada 语言的注释格式,那么上面函数应写成long gcd(p,q)long p,q;if (p%q = 0)- then part return qelse- else part return gcd(q, p%q);18. 解答:略!第 4 章习题 解答:1,2,
14、3,4 解答 略!5. 解答:(1) (2) (3) (4) (5) (6) (7) (8)6. 解答:(1)A: B: C: D: E:(2)A: B: C: D: E:7.解答:(1) 消除给定文法中的左递归,并提取公因子:bexprbterm or bterm btermbfactor and bfactor bfactornot bfactor | (bexpr) | true |false (2) 用类 C 语言写出其递归分析程序: void bexpr();bterm();WHILE(lookahead =or) match (or);bterm();void bterm();bf
15、actor();WHILE(lookahead =and)match (and);bfactor();void bfactor();if (llokahead=not) then match (not);bfactor();else if(lookahead=() then match ();bexpr();match();else if(lookahead =true) then match (true)else if (lookahead=false)then match (false);else error;8. 解答:消除所给文法的左递归,得 G:S (L)|a L SLL ,SL |
16、 实现预测分析器的不含递归调用的一种有效方法是使用一张分析表和一个栈进行联合控制,下面构造预测分析表:根据文法 G有:First(S) = ( , a ) Follow(S) = ) , , , #First(L) = ( , a ) Follow(L) = ) First(L) = , Follow(L) = ) 按以上结果,构造预测分析表 M 如下:文法 G是 LL(1)的,因为它的 LL(1)分析表不含多重定义入口。预测分析器对输入符号串(a,(a,a)做出的分析动作如下:步骤 栈 剩余输入串 输出1 #S (a,(a,a)# #2 #)L( a,(a,a)# S (L)3 #)L a,
17、(a,a)#4 #)LS a,(a,a)# L SL5 #)La a,(a,a)# S a6 #)L ,(a,a)#7 #)LS, ,(a,a)# L ,SL8 #)LS (a,a)#9 #)L)L( (a,a)# S (L)10 #)L)L a,a)#11 #)L)LS a,a)# L SL12 #)L)La a,a)# S a13 #)L)L ,a)#14 #)L)LS, ,a)# L ,SL15 #)L)LS a)#16 #)L)La a)# S a17 #)L)L )#18 #)L) )# L19 #)L )#20 #) )# L21 # #9. 解答:各非终结符的 First 集:F
18、irst(S)=First(A)First(B) b=a,b, First(A)=b=b,First(B)a=a,First(C)=First(A) First(D) First(b) =a,b,cFirst(D)=ac=a,c各个候选式的 First 集为:First(AB)=a,b, First(bC)=bFirst() First(b)bFirst(aD)=a First(AD)=a,b,cFirst(b)=b First(aS)=aFirst(c)=c 各非终结符的 Follow 集的计算:Follow(S)=#Follow(D) =#Follow(A)=(First(B)Follow
19、(S)First(D) =a,#,cFollow(B)=Follow(S) =#Follow(C)=Follow(S) =#Follow(D)=Follow(B)Follow(C) =#10解答:(1) 求 First 和 Follow 集 First(E)=First(T)=(,a,b, First(E)=+, First(T)=First(F)=(,a,b, First(T)=(,a,b, , First(F)=First(P)=(,a,b, First(F)=*, First(P)=(,a,b, (计算顺序)Follow(E)= #, ) Follow(E)= Follow(E)=#,)
20、 (1)(使用的产生式)Follow(T) = First(E)Follow(T) (1,2)= +),#=+,),#Follow(T)= Follow(T)=+,# (3)Follow(F)= First(T) Follow(T) (3,4)= (,a,b,+ ,),#Follow(F)= Follow(F) (5)= (,a,b,+ ,),#Follow(P)= First(F)Follow(F) (5,6)=*,(,a,b,+ ,),# (2) 证明: a. 文法不含左递归;b. 每个非终结符的各个侯选式的 First 集不相交;c. First(E)Follow(E)=+, #,) ,
21、=First(T)Follow(T)=(,a,b, +,)=First(F)Follow(F)=*, ,a,( ,+, ,#= 改造后的文法满足 LL(1)文法的三个条件,是 LL(1)文法。(3) 预测分析表如下所示。a b * + ( ) #E ETE ETE ETEE E+E E ET TFT TFT TFT TFTT TT TT TT TT T TF FPF FPF FPF FPFF F F F*F F F F F FP Pa Pb P P(E)11. 解答:(1)a. 文法不含左递归; b. S,A,B 各候选式的 First 集不相交;c. First(A)Follow(A)=a,
22、b= First(B)Follow(B)=b, =该文法为 LL(1)文法。(2) a. 文法不含左递归;b. S,A,B 各候选式的 First 集不相交;c. First(A)Follow(A)=a,b, b=b 该文法不是 LL(1)文法。12. 解答: 最右推导:E=T=F=(E)=(ET)=(EF)=(Ei)= (Ti)=(T*Fi)语法树:图 4.1 句型(T*Fi)的语法树 短语 :(T*F i),T*Fi ,T*F,i 素短语:T*F,i最左素短语:T*F 由于 E =E+T =E+T*F, 故 E+T*F 为该文法的句型 短语:T*F、E+T*F SAbc AaBbSAbAa
23、B Bb 直接短语: T*F 句柄: T*F13. 解答:最左推导:S= (T) = (T,S) = (S,S) = (a,S) = (a,(T) = (a,(T,S) = (a,(S,S) = (a,(a,S) = (a,(a,a)最右推导:S= (T) = (T,S) = (T,(T) = (T,(T,S) = (T,(T,a) = (T,(T,a) = (T,(a,a) = (S,(a,a) = (a,(a,a)文法中 S 和 T 的 FirstVT 和 LastVT 集为:FirstVT(S)=a,( FirstVT(T)=,a, ( lastVT(S)=a, ) lastVT(T)=
24、,a,)文法 GS的算符优先关系表: 根据优先关系表,对每个终结符或#建立符号 f 与 g,把 f(和 g)分成一组。根据 GS的算符优先关系表,画出如下的有向图。优先函数如下:用算符优先分析法分析句子(a,(a,a)。给定的输入符号串是文法的一个句子。14. 解答:(1) 该文法的拓广文法 G为 0S S1S aSAB2S BA3A aA4A B5B b其 LR(0)项目集规范族和识别活前缀的 DFA 如下:I0 = SS, SaSAB, SBA, BbI1 = SSI2 = BbI3 = SaSAB, SaSAB, SBA, BbI4 = SBA, AaA, AB, BbI5 = SaSA
25、B, AaA, AB, BbI6 = SaSAB, BbI7 = AaA, AaA, AB, BbI8 = ABI9 = SBAI10 = SaSABI11 = AaA显然,上述状态中没有出现冲突。显然,该文法是 LR(0)的文法,因此也是 SLR(1)的。求各个非终结符的 Follow 集,以便构造分析表:Follow(S)=# Follow(S)=a,b,#Follow(A)=a,b,# Follow(B)=a,b,#构造的 SLR(1)分析表如下:(2) 该文法的拓广文法 G为 0S S 1S Sab 2S bR 3R S 4R a其 LR(0)项目集规范族和识别活前缀的 DFA 如下:
26、I0 = SS, SSab, SbRI1 = SS, SSabI2 = SbR, RS, Ra, SSab, SbRI3 = SSabI4 = SbRI5 = RS, SSabI6 = RaI7 = SSab显然,I 1 和 I5 存在移进-归约冲突。求 S和 R 的 Follow 集:Follow(S)=#Follow(R)=Follow(S)=a,#在 I5 中,出现的移进归约冲突,且 Follow(R)a=a,不能用 SLR(1)方法解决。因此,此文法不是 SLR(1)文法。15. 解答:(1) 构造其拓广文法 G的产生式为 0S S1S A2A BA3A 4B aB5B b构造其 LR
27、(0)项目集规范族和 goto 函数(识别活前缀的 DFA)如下:I0 = SS, #, SA, #, ABA, #, A, #,BaB, a/b/#, Bb, a/b/# I1 = SS, #I2 = SA, #I3 = ABA, #, ABA, #, A, #,BaB, a/b/#, Bb, a/b/#I4 = Bb, a/b/# I5 = BaB, a/b/#, BaB, a/b/#, Bb, a/b/#I6 = ABA, #I7 = BaB, a/b/#该文法的 LR(1)项目集规范族中没有冲突,所以该文法是 LR(1)文法。构造 LR(1)分析表如下:以上分析表无多的定义入口,所以该
28、文法为 LR(1)文法。(3)对于输入串 abab,其分析过程如下: 16. 解答:(1) 对于产生式 SAaAb|BbBa 来说First(AaAb)First(BbBa)=ab=A,BV N 仅有一条候选式。因此,这个文法是 LL(1)的。(2) 下面构造这个文法的识别活前缀的 DFA。I0 = SS, SAaAb, SBbBa, A, B I1 = SSI2 = SAaAbI3 = SBbBaI4 = SAaAb, AI5 = SBbBa, BI6 = SAaAbI7 = SBbBaI8 = SAaAbI9 = SBbBa由于 Follow(A)=Follow(B)=a, b,因此项目集
29、 I0 中存在归约-归约冲突。在 I0 状态下,当输入符号是 a 或是 b 时,不知用 A 还是 B 进行归约。故此文法不是 SLR(1)的。但是,此文法时 LR(1)的。17. 解答:该文法的拓广文法 G为 0S S1S (SR2S a3R ,SR4R )构造其 LR(0)项目集规范族和 goto 函数( 识别活前缀的 DFA)如下:I0 = SS, S(SR, SaI1 = SSI2 = S(SR, S(SR, SaI3 = SaI4 = S(SR, R,SR, R)I5 = S(SRI6 = R)I7 = R,SR, S(SR, SaI8 = R,SR, R,SR, R)I9 = R,S
30、R每个 LR(0)项目集中没有冲突。因此,此文法是 LR(0)文法。其分析表如下:18解答: 略!第 5 章习题 解答:1,2,3 解答: 略!4. 解答:(1) 设 S,L,B 的值的属性用 val 表示:SS printf(S.val)SL 1.L2 S.val:= L1.Val+ L2.val/2L2.lengthSL S.val:=L.valLL 1B L.val:=L1.val*2+B.val,L.length = L1.length+1 LB L.val:=B.val),L.length:=1 B0 B.val:=0B 1 B.val:=1(2) 为 S,L 引入属性 h,用来记录
31、配对的括号个数:SS printf(S.h)Sa S.h:=0S(L) S.h:=S.h+1LL (1),S L.h:=L(1).h+S.hLS L.h:=S.h)(3) 为 D 引入一个综合属性 h,用来记录 D 中含 id 的个数:PD printf(D.h)DD 1;D2 D.h:=D1.h+D2.hDid:T D.h:= 1Dproc id; D 1;S D.h:=D1.h+15. 解答:输入串为 bcccaadadadb 时的语法树为:采用修剪语法树的方法,按句柄方式自下而上归约该语法树,在归约时调用相应的语义规则,由此得到最终的翻译结果为:34242421.6. 解答:(a+b)+
32、(c+d/(e-3)*87. 解答:(1) ab-c+*(2) A not C D not or not or(3) abcde/+*+(4) A B and C not D or or (5) a-bc-d+*+(6) A B or C D not E and or and8. 解答:三元式 四元式 (+,a,b) 1.(+,a,b,T1) (-,1,-) 2.(-,T,-, T2) (+,c,d) 3.(+,c,d,T3) (*,2,3) 4.(*, T2,T 3,T4) (+,a,b) 5.(+,a,b,T5) (+,c,5) 6.(+, T5,c, T6) (-,4,6) 7.(-,
33、T4, T6 ,T7)9. 解答:四元式代码为:1. (jnz, A,_, x)2. (j,_,_,3)3. (jnz, B,_, 5)4. (j,_,_,y)5. (jnz, C,_, y)6. (j,_,_,7)7. (jnz, D,_,y)8. (j,_,_,x)10. 解答:11. 解答:(1) 四元式序列为: 1 (j, i,t1,15)7. (+, a, b, t3 )14. (j, , , 4)15.12. 解答:略!第 6 章习题解答:1,2,3,4,5 解答:略!6. 解答:本题考查的要点是掌握栈式动态存储分配策略中运行的布局,填充过程活动记录display 表的内容。运行栈
34、的布局遵循“先进后出”原则,即一个过程调用另一个过程时,被调用过程则在调用过程的栈顶构筑自己的数据区,形成自己的活动记录,包括自己的 display 表。而display 表内容的项数与过程的嵌套层次有关,一般比过程的嵌套层数大 1。(1) demo A此时的运行栈只有主程序 demo 和过程 A 的 2 个数据区,过程 A 只引用主程序 demo 全局数据和其自身的局部数据,因此其 display 表内容有 2 项,即主程序数据区首址和过程A 的主程序数据区首址。(2) demo AB 此时的运行栈只有主程序 demo、过程 A 和过程 B 的 3 个数据区,过程 B 嵌套定义在过程 A 中
35、,要引用主程序 demo 全局数据、过程 A 的数据和其自身的局部数据,因此其display 表内容有 3 项,即主程序数据区首址、过程 A 的主程序数据区首址和过程 B 本身的数据区首址。(3) demo ABB 此时的运行栈包括主程序 demo、过程 A 和 2 个过程 B 的实例的 4 个数据区,过程 B 要引用的数据区还是 3 个:主程序 demo 全局数据、过程 A 的数据和当前活跃过程 B 的局部数据(栈顶数据项) ,因此其 display 表内容还是有 3 项,即主程序数据区首址、过程 A 的主程序数据区首址和当前活跃过程 B 本身的数据区首址。(4) demo ABBA 此时的运行栈包括主程序 demo、2 个过程 A 和 2 个过程 B 的实例的 5 个数据区,但过程 A 只引用主程序 demo 全局数据和其自身的局部数据,因此其 display 表内容只有 2 项,即主程序数据区首址和过程 A 的主程序数据区首址。各个运行时刻运行栈的布局和使用的 display 表如图。