收藏 分享(赏)

编译原理第三版课后习题解答.doc

上传人:tangtianxu2 文档编号:2888425 上传时间:2018-09-29 格式:DOC 页数:27 大小:962.50KB
下载 相关 举报
编译原理第三版课后习题解答.doc_第1页
第1页 / 共27页
编译原理第三版课后习题解答.doc_第2页
第2页 / 共27页
编译原理第三版课后习题解答.doc_第3页
第3页 / 共27页
编译原理第三版课后习题解答.doc_第4页
第4页 / 共27页
编译原理第三版课后习题解答.doc_第5页
第5页 / 共27页
点击查看更多>>
资源描述

1、第二章习题解答P36-6(1)是 09 组成的数字串LG()1(2)最左推导: 568534 012701DDN D最右推导: N727127012743868568P36-7G(S)ONDSA1357924680|P36-8文法: ETFi|*/()最左推导: FTiiTFiiFiETETTiii*()()()()()()最右推导: FTiFiiiFiiTTEFii*()()()()()(语法树:/*EEFTE+TFFT+iiiEEFTE-TFFT-iiiEEFT+TFii*+i i- i+*/P36-9句子 iiiei 有两个语法树:SieiSieiP36-10/*) (|ST*/P36-

2、11/*L1: |cCabASL2: bcBaAS|L3:|aBbASL4: ABS|01|*/第三章习题参考答案P647(1)10(|)*01 1 0 11确定化:0 1X 1,2,3 1,2,3 2,3 2,3,42,3 2,3 2,3,42,3,4 2,3,5 2,3,42,3,5 2,3 2,3,4,Y2,3,4,Y 2,3,5 2,3,4,01 00 0 1 1 00 1011 1最小化:X 1 2 3 4 Y5X Y6012 354,012345610234512601230 4560121, 01 0 0 1 00 1011 1P648(1) 01)|(*(2) )5|0(|)9

3、|87|65|43|210)(9|87|65|43|2( *(3) *)|(1|)0|(P6412(a)aa,ba确定化:a b0 0,1 10,1 0,1 11 0 5012430 1 给状态编号:a b0 1 21 1 22 0 33 3 3aaa b b bba最小化:,01230123ab a ab bab(b)b b aa baa bb aa a已经确定化了,进行最小化0 12 30 1 20 2 31 4 5最小化:, 01234501243524355012430124, ,abbaba,3355bb b aa baP6414(1) 010(2):(|)*010 10确定化:0

4、1X,1,Y 1,Y 20 1 20 1YXYX211,Y 1,Y 22 1,Y 给状态编号:0 10 1 21 1 22 1 33 3 3001 01 1 10最小化: ,012301230 01 1 100第四章P811(1) 按照 T,S 的顺序消除左递归|,)(|TSaG递归子程序:procedure S;beginif sym=a or sym= then abvanceelse if sym=( 02130 1 3then beginadvance;T;if sym=) then advance;else error;endelse errorend;procedure T;beg

5、inS; Tend;procedure ;beginif sym=, then beginadvance;S; Tendend;其中:sym:是输入串指针 IP 所指的符号 advance:是把 IP 调至下一个输入符号error:是出错诊察程序(2)FIRST(S)=a,(FIRST(T)=a,(FIRST( T)=,FOLLOW(S)=),#FOLLOW(T)=)FOLLOW( )=)预测分析表a ( ) , #S STT TS TS,是 LL(1)文法P812文法:|)(*|baEPFTE(1)FIRST(E)=(,a,b,FIRST(E)=+,FIRST(T)=(,a,b,FIRST(

6、T)=(,a,b,FIRST(F)=(,a,b,FIRST(F)=*,FIRST(P)=(,a,b,FOLLOW(E)=#,)FOLLOW(E)=#,)FOLLOW(T)=+,),#FOLLOW(T)=+,),#FOLLOW(F)=(,a,b,+,),#FOLLOW(F)=(,a,b,+,),#FOLLOW(P)=*,(,a,b,+,),#(2)考虑下列产生式: ETFPab|*|()FIRST(+E)FIRST()=+=FIRST(+E)FOLLOW(E)=+#,)=FIRST(T)FIRST()=(,a,b,=FIRST(T)FOLLOW(T)=(,a,b,+,),#=FIRST(*F)F

7、IRST()=*=FIRST(*F)FOLLOW(F)=*(,a,b,+,),#=FIRST(E)FIRST(a) FIRST(b) FIRST()=所以,该文法式 LL(1)文法.(3)+ * ( ) a b #E ETETETE T FFFT F FPFPFPF *P E()ab(4)procedure E;beginif sym=( or sym=a or sym=b or sym= then begin T; E endelse errorendprocedure E;beginif sym=+ then begin advance; E endelse if sym# then er

8、rorendprocedure T;beginif sym=( or sym=a or sym=b or sym= then begin F; T endelse errorendprocedure T;beginif sym=( or sym=a or sym=b or sym= then T else if sym=* then errorendprocedure F;beginif sym=( or sym=a or sym=b or sym= then begin P; F endelse errorendprocedure F;beginif sym=* then begin adv

9、ance; F endendprocedure P;beginif sym=a or sym=b or sym= then advanceelse if sym=( thenbeginadvance; E;if sym=) then advanceelse errorendelse errorend;P813/*(1) 是,满足三个条件。(2) 不是,对于 A 不满足条件 3。(3) 不是,A、B 均不满足条件 3。(4) 是,满足三个条件。*/第五章P1331ETF*短语: E+T*F, T*F,直接短语: T*F句柄: T*FP1332文法: SaT|(),(1)最左推导: SaTaSaS

10、aSTTST(),(,),(,)(,)(,)(,)(,)(,),(,)(,)(,)(,)(,)(,)a最右推导:STSTSTaSTaaaaS(),)(,)(,)(,)(,)(,),(,)()()()(),),S Saa(2)(a,a),(a),a)(S,a),(a),a)(T,a),(a),a)(T,S),(a),a)(T),(a),a)(S,(a),a)(T,(a),a)(T,S,(a),a)(T,(a),a)(T,(S),a)(T,(T),a)(T,S),a)(T),a)(S,a)(T,S)(T)S“移进-归约”过程:步骤 栈 输入串 动作0 # (a,a),(a),a)# 预备1 #(

11、(a,a),(a),a)# 进2 #( (a,a),(a),a)# 进3 #( a,a),(a),a)# 进4 #(a ,a),(a),a)# 进5 #(S ,a),(a),a)# 归6 #(T ,a),(a),a)# 归 7 #(T, a),(a),a)# 进8 #(T,a ),(a),a)# 进9 #(T,S ),(a),a)# 归10 #(T ),(a),a)# 归11 #(T) ,(a),a)# 进12 #(S ,(a),a)# 归13 #(T ,(a),a)# 归 14 #(T, ,(a),a)# 进15 #(T, ,(a),a)# 进16 #(T,S ,(a),a)# 归17 #(

12、T ,(a),a)# 归18 #(T, (a),a)# 进19 #(T,( a),a)# 进20 #(T,(a ),a)# 进21 #(T,(S ),a)# 归22 #(T,(T ),a)# 归23 #(T,(T) ),a)# 进24 #(T,S ),a)# 归25 #(T ),a)# 归26 #(T) ,a)# 进27 #(S ,a)# 归28 #(T ,a)# 归29 #(T, a)# 进30 #(T,a )# 进31 #(T,S )# 归32 #(T )# 归33 #(T) # 进34 #S # 归P1333(1) FIRSTVT(S)=a,(FIRSTVT(T)=,a,(LASTVT(

13、S)=a,)LASTVT(T)=,a,)(2)a ( ) ,a ( , 是算符文法,并且是算符优先文法6G(3)优先函数a ( ) ,f 4 4 2 4 4g 5 5 5 2 3faff(f),gag(g),(4)栈 输入字符串 动作# (a,(a,a))# 预备#( a, (a,a)# 进#(a , (a,a)# 进#(t , (a,a)# 归#(t, (a,a))# 进#(t,( a,a) )# 进#(t,(a ,a) )# 进#(t,(t ,a) )# 归#(t,(t, a) )# 进#(t,(t,a ) )# 进#(t,(t,s ) )# 归#(t,(t ) )# 归#(t,(t) )

14、# 进#(t,s )# 归#(t )# 归#(t ) # 进# s # 归successP1345(1)0. 1. 2. 3.SSSAS4. 5. 6. 7.Abb8. 9. 10. 11.aa(2)S A SaA Sd 确定化:S A a b0,2,5,7,10 1,2,5,7,8,102,3,5,7,10 11 61,2,5,7,8,10 2,5,7,8,10 2,3,5,7,9,10 11 60 105761112 3 48 9 2,3,5,7,10 2,4,5,7,8,102,3,5,7,10 11 62,5,7,8,10 2,5,7,8,10 2,3,5,7,9,1011 62,3,

15、5,7,9,102,4,5,7,8,102,3,5,7,10 11 62,4,5,7,8,102,5,7,8,10 2,3,5,7,9,1011 611 6 A SS A abS a A S b S A ba AA Sba a b b aDFA构造 LR(0)项目集规范族也可以用 GO 函数来计算得到。所得到的项目集规范族与上图中的项目集一样:= , , , , 0ISASbSAaGO( ,a)= =a1IGO( ,b)= = 2GO( ,S)= , , , , , =0ISAb3I0: SbA 4: Sa3: SAa2: S1: 5: bSa6: Sb7: SAGO( ,A)= , , ,

16、, =0ISASbASa4IGO( ,a)= =3a1IGO( ,b)= =b2GO( ,S)= , , , , =I5IGO( ,A)= , , , , , =3 A6IGO( ,a)= =4 1IGO( ,b)= =IS2GO( ,S)= , , , , , =ASASbSa7IGO( ,A)= , , , , =4 4IGO( ,a)= =5Ia1IGO( ,b)= =b2GO( ,S)= , , , , =5IGO( ,A)= , , , , , =5ISSSbSAa6IGO( ,a)= =6A1IGO( ,b)= = 2GO( ,S)= , , , , , =IA7IGO( ,A)=

17、 , , , , =6 4IGO( ,a)= =7a1IGO( ,b)= =ISb2GO( ,S)= , , , , =ASbSAa5IGO( ,A)= , , , , , =7 A6I项目集规范族为 C= , , , , , , 1I23I45I67I(3)不是 SLR 文法状态 3,6,7 有移进归约冲突状态 3:FOLLOW(S)=#不包含 a,b状态 6:FOLLOW(S)=#,a,b包含 a,b,;移进归约冲突无法消解状态 7:FOLLOW(A)=a,b包含 a,b;移进归约冲突消解所以不是 SLR 文法。(4) 构造例如 LR(1)项目集规范族见下图:对于状态 5,因为包含项目 ,

18、所以遇到搜索符号 a 或 b 时,应该用baAS/ 归约。又因为状态 5 包含项目 ,所以遇到搜索符号 a 时,应该AS/ 移进。因此存在“移进-归约”矛盾,所以这个文法不是 LR(1)文法。b b bAA AS aa SS a Sa a A aAS bSA ba a S b bS bAA0: a/S#/bA2: a/bS#/A/b 1: a/b/Sa/#3: /bA4: a/bS#5: /baS/a/S6: a/A/bSa/7: a/bAS/ #9: a/A /b a/8: /bS a/10: a/bS3:5:第六章/*第六章会有点难P1645(1)E E1T if (E1.type = i

19、nt) and (T.type = int )then E.type := intelse E.type := realE T E.type := T.typeT num.num T.type := realT num T.type := int(2)P1647S L1|L2 S.val:=L1.val+(L2.val/2 )lengthL.2S L S.val:=L.valL L1B L.val:=2*L1.val + B.val;L.length:=L1.length+1L B L.val:=B.c;L.length :=1B 0 B.c:=0B 1 B.c:=1*/第七章P2171a*(

20、-b+c) abc+*a+b*(c+d/e) abcde/+*+-a+b*(-c+d) abcd+*+)(DCACDA)BB)(EEif (x+y)*z =0 then (a+b)c else abc xy+z*0= ab+cabc ¥或 xy+z*0= P1 jez ab+c P2 jump abc P1 P2P2173-(a+b)*(c+d)-(a+b+c)的三元式序列:(1) +, a, b(2) , (1), -(3) +, c, d(4) *, (2), (3)(5) +, a, b(6) +, (5), c(7) -, (4), (6)间接三元式序列:三元式表:(1) +, a,

21、b(2) , (1), -(3) +, c, d(4) *, (2), (3)(5) +, (1), c(6) -, (4), (5)间接码表:(1)(2)(3)(4)(1)(5)(6)四元式序列:(1) +, a, b, 1T(2) , , -, 2(3) +, c, d, 3(4) *, , , 24(5) +, a, b, 5(6) +, , c, T6(7) -, , , 47P2184自下而上分析过程中把赋值句翻译成四元式的步骤:A:=B*(-C+D)步骤 输入串 栈 PLACE 四元式(1) A:=B*(-C+D)(2) :=B*(-C+D) i A(3) B*(-C+D) i:=

22、 A-(4) *(-C+D) i:=i A-B(5) *(-C+D) i:=E A-B(6) *(-C+D) i:=E A-B(7) (-C+D) i:=E* A-B-(8) -C+D) i:=E*( A-B-(9) C+D) i:=E*(- A-B-(10) +D) i:=E*(-i A-B-C(11) +D) i:=E*(-E A-B-C (,C,-, )T1(12) +D) i:=E*(E A-B-T1(13) D) i:=E*(E+ A-B- -(14) ) i:=E*(E+i A-B- -D(15) ) i:=E*(E+E A-B- -D (+, ,D, )12(16) ) i:=E

23、(E A-B- 2(17) i:=E*(E) A-B- -T(18) i:=E+E A-B- (*,B, , )T3(19) i:=E A- (:=, ,-,A)3(20) A产生的四元式:(,C,-, )T1(+, ,D, )2(*,B, , )3(:=, ,-,A)P2185/*设 A :10*20,B、C、D:20,宽度为 w4 则T1:= i * 20T1:=T1+jT2:=A84T3:=4*T1Tn:=T2T3 /这一步是多余的T4:= i + jT5:=B4T6:=4*T4T7:=T5T6T8:= i * 20T8:=T8+jT9:=A84T10:=4*T8T11:=T9T10T1

24、2:= i + jT13:=D4T14:=4*T12T15:= T13T14T16:=T11+T15T17:=C4T18:=4*T16T19:=T17T18T20:=T7+T19Tn:=T20*/P2186100.(jnz, A, -, 0)101. (j, -, -, 102)102. (jnz, B, -, 104)103. (j, -, -, 0)104. (jnz, C, -, 103)105. (j, -, -, 106)106. (jnz, D, -, 104) -假链链首107. (j, -, -, 100) -真链链首假链:106,104,103真链:107,100P21871

25、00.(j,E1.place ,E2.place ,0);emit(I.Place :=E1.place);F.truelist := makelist(nextquad);emit(j,-,-,-);F.place := I.place;F.end := E2.place;p:=lookup(id.name);idIif p nil thenI.place := pelse errorM.quad := nextquadM*/方法 2:S for id:=E1 to E2 do S1S F S1F for id:=E1 to E2 dodo21:toEfridINITIAL=NEWTEMP;

26、emit(:=, E1.PLACE, -, INITIAL);FINAL=NEWTEMP;emit(:=, E2.PLACE, -, FINAL);p:= nextquad+2;emit(j, INITIAL , FINAL , p);F.nextlist:=makelist(nextquad);emit(j,);F.place:=lookup(id.name);if F.placenil thenemit(F.place := INITIAL)F.quad:=nextquad;F.final:=FINAL; 1FSbackpatch(S1.nextlist, nextquad)p:=next

27、quad+2;emit(j, F.place, F.final , p );S.nextlist := merge(F.nextlist, makelist(nextquad);emit(j,);emit(succ, F.place , -, F.place);emit(j, F.quad);第九章P2709(1) 传名即当过程调用时,其作用相当于把被调用段的过程体抄到调用出现处,但必须将其中出现的任一形式参数都代之以相应的实在参数。A:=2; B:=3; A:=A+1; A:=A+(A+B); print A; A=9 (2) 传地址即当程序控制转入被调用段后,被调用段首先把实在参数抄进相应

28、的形式参数的形式单元中,过程体对形参的任何引用或赋值都被处理成对形式单元的间接访问。当被调用段工作完毕返回时,形式单元(都是指示器)所指的实参单元就持有所希望的值。A:=2;B:=3;T:=A+B把 T,A,A 的地址抄进已知单元 J1,J2,J3x:J1;y:=J2;z:=J3 /把实参地址抄进形式单元,且 J2=J3Y:=y+1Z:=z+x / Y:对 y 的间接访问Z:对 z 的间接访问print AA=8(3) 得结果每个形参均对应两个单元,第一个存放实参地址,第二个存放实参值,在过程体中对形参的任何引用或赋值都看成是对它的第二个单元的直接访问,但在过程工作完毕返回前必须把第二个单元的

29、内容放到第一个单元所指的那个实参单元中A:=2;B:=3;T:=A+B把 T,A,A 的地址抄进已知单元 J1,J2,J3x1:=J1;x2:=T;y1:=J2;y2:=A;z1:=J3;z2:=A; /将实参的地址和值分别放进两个形式单元中y2:=y2+1; z2:=z2+x2; /对形参第二个单元的直接访问x1:x2; y1:=y2; z1:=z2 /返回前把第二个单元的内容存放到第一个单元所指的实参地址中print AA=7(4) 传值即被调用段开始工作时,首先把实参的值写进相应的形参单元中,然后就好像使用局部变量一样使用这些形式单元A:=2;B:=3;x:=A+By:=Az:=Ay:=

30、y+1z:=z+xprint AA=2过程调用不改变 A 的值第十章P306-1P306-2read A,BF:=1C:=A*A 1BD:=B*Bif C100 goto 2L B1B2 B5B4 B3-halt 4B-: F:=F-12Lgoto 15-基本块为 、 、 、 、1B2345BP307-4I:=1read J,KA:=K*IB:=J*IT:=K*100L: C:=A*Bwrite CA:=A+KB:=B+J if AT goto LhaltB2 有回路,所以B2是循环,B2 既是入口节点,又是出口节点(1) 代码外提:不存在不变运算,故无代码外提(2) 强度削弱:A:=K*I B:=J*I *+(3) 删除基本归纳变量:I100 可以用 A100*K 或 B100*J 代替P307-5A:=0I:=1L1: A:=C+Aif C=R goto L2C:=C+1goto L1L2:B:=J+1C:=B+IR:=B+100B2,B3是循环,B2 是入口节点,也是出口节点(1) 代码外提:B:=J+1(2) 删除归纳变量A:=0I:=1L1: A:=C+Aif C=T goto L2C:=C+1goto L1L2:B:=J+1C:=B+IT:=B+100

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 专业基础教材

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报