程序设计语言与编译习题解答.doc
【精品文档】如有侵权,请联系网站删除,仅供学习与交流程序设计语言与编译习题解答.精品文档.4-5 解:上下文有关文法(1型文法),产生的语言L(G)=aibici | i1,i为整数4-6 解:3型文法,L(G)=ai | i1,i为奇数4-7 解:2型文法,L(G)=aibi | i1,i为整数4-8 解:1型文法,L(G)=aibici | i1,i为整数4-9 解:1. 最左推导最右推导SÞ (A) Þ (B) Þ(SdB)SÞ (A) Þ (B) Þ (SdB)Þ (A)dB) Þ (B)dB) Þ (SdS) Þ (Sda)Þ (S)dB) Þ (b)dB) Þ (A)da Þ (B)da)Þ (b)dS) Þ (b)da) Þ (s)daÞ (b)da)2. 语法树4-10解:1. 因为存在推导S Þ SbF Þ SbP Þ Sbc Þ Fbc Þ FaPbc所以FaPbc是文法G (S) 的一个句型。2. 语法树4-11解:因为串aaabaa可有下列两棵不同的语法树所以文法G (S)是二义文法。9-2解:(1)消除文法G的产生式直接左递归。ASeA' | fA' A'dA' | e (2)消除间接左递归:按S.A排序(按书上P116页的算法i=2,j=1时)将S的产生式代入有AAaeA' | AbeA' | ceA' | fA' (3)消除的直接左递归有AceA'A" | fA'A" A"aeA'A" | beA'A" | e (4)对S的产生式提公因子有SAB | c B| a | b (5)最后,文法G提取公因子,消除左递归后的产生式由, , , 和组成,无多余的产生式。(6)若按A.S排序,得到的产生式组合是另外的形式,但它们是等价的文法,读者可以试试。9-3解:消除左递归后,得文法G':S(L) | aLSL'L', SL' | e递归下降过程: Procedure match(t:token); begin if lookahead=t then lookahead=nexttoken else error end procedure S; begin if lookahead='a' then match('a') else if lookahead='(' then begin match('c'); L; if lookahead=')' then match(')') else error end end procudure L; begin S; L' end procudure L' begin if lookahead=',' then begin match(',') S; L' end end9-6解:(1)G'(S):SAS' S'iAS' | e ABA' A'+BA'e BbS* | a (2)FIRST集和FOLLOW集FIRSTFOLLOWSb,a#,*S'i,e#,*Ab,a#,*,iA'+,e#,*,iBb,a#,*,i,+预测分析表ai+b*#SSAS'SAS'S'S'iAS'S'eS'eAABA'ABA'A'AeA+BA'AeAeBBaBbS*(3)因为预测分析表无多重定义入口,所以G'是LL(1)文法。9-7解:对习题9-3的文法G消除左递归后,得文法G': S(L) | a LSL' L',SL' | e FIRST集和FOLLOW集FIRSTFOLLOWS(,a),#L(,a)L',e)预测分析表()a,#SS(L)SaLLSL'LSL'L'L')L',SL'因为预测分析表无多重定义入口,所以文法G是LL(1)文法。10-1解:(1)规范规范推导(最右推导)最右推导SÞABÞASbÞAABbÞbBABb(2)语法树(推导树)(3)短语 bB, AB, ABb, bBABb 直接短语 bB, AB 句柄 bB 最左素短语 bB10-2解:(1)因为存在推导SÞSbFÞFbFÞFaPbFÞFaPbPÞFaPbc所以FaPbc是文法G的一个句型。(2)语法树(3)短语 FaP, c, FaPbc 直接短语 FaP, c 句柄 FaP 最左素短语 FaP10-3解:拓广文法0.S'S1.SAS2.Sb3.ASA4.AaLR(0)项目集规范族I0=closureS'·S I1=GO(I0,S) I2=GO(I0,A) I3=GO(I0,b)I0:S'·S S'S· SA·S Sb·S·AS AS·A S·AS GO(I1,a)=I4S·b A·SA S·b GO(I2,A)=I2A·SA A·a A·SA GO(I2,b)=I3A·a S·AS A·a S·bI4=GO(I0,a) I5=GO(I1,A) I6=GO(I1,S) I7=GO(I2,S)Aa· ASA· AS·A SAS· SA·S A·SA AS·A S·AS A·b A·SA S·b S·AS A·a A·SA S·b S·AS A·a S·b GO(I1,b)=I3 GO(I2,a)=I4FOLLOW(S)=a, b, #FOLLOW(A)=a, b 状态5在输入a时有S4和r3的移进归约矛盾。 状态5在输入b时有S3和r3的移进归约矛盾。 状态7在输入a时有S4和r1的移进归约矛盾。 状态7在输入b时有S3和r1的移进归约矛盾。 文法G既不是LR(0)文法,也不是SLR(1)文法。10-4解:(1)最左推导 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,(S,a)Þ(T,(a,a)Þ(S,(a,a)Þ(a,(a,a) 最左推导 SÞ(T)Þ(T,S)Þ(S,S)Þ(T),S)Þ(S),S)Þ(T,S),S) Þ(T,S,S),S)Þ(S,S,S),S)Þ(T),S,S),S) Þ (T,S),S,S),S)Þ(S,S),S,S),S)Þ(a,S),S,S),S) Þ(a,a),S,S),S)Þ(a,a),S),S)=(a,a),(T),S) Þ(a,a),(S),S)Þ(a,a),(a),S) =(a,a),(a),S)Þ(a,a),(a),a)最右推导SÞ(T)Þ(T,S)Þ(T,a) Þ(S,a)Þ(T),a)Þ(T,S),a) Þ(T,(T),a)Þ(T,(S),a)Þ(T,(a),a)Þ(T,S,(a),a) Þ(T,(a),a)Þ(S,(a),a)Þ(T),(a),a) Þ(T,S),(a),a)Þ(T,a),(a),a)Þ(S,a),(a),a) Þ(a,a),(a),a)(2)对句子(a,(a,a)的移进归约栈的变迁如下:其中,(3),(4),(8),(9),(12),(13),(15),(16),(18)共进行9次归约,最右推导也是9次推导,正好是递过程。归约(3)的句柄是a,语法树如图(1)所示。归约(4)的句柄是S,语法树如图(2)所示。归约(8)的句柄是a,语法树如图(3)所示。归约(9)的句柄是S,语法树如图(4)所示。归约(12)的句柄是S,语法树如图(5)所示。归约(13)的句柄是T,S,语法树如图(6)所示。归约(15)的柄是(T),语法树如图(7)所示。归约(16)的句柄是T,S,语法树如图(8)所示。归约(18)的句柄是(T),语法树如图(9)所示。图(9)即是完整的语法树。图中的下标是为了区分归约过程中同名文法符号和便于理解而添加的,实际是没有的,对句子(a,a),(a),a)的规约栈变迁如图(10)所示。图(10)规范推导(最右推导)一共进行17步推导,归约过程也进行了17次归约,语法树如图(11)所示,其中的下标可表明其形成的先后。图(11)10-7解:0.S'SFOLLOW(S)=$1.SABFOLLOW(A)=b,c2.BcBdFOLLOW(B)=d,$3.Bcd4.AaAb5.AabI0=closureS'·SI0:S'·SI4=GO(I2,B)I9=GO(I5,d) S·AB SAB· Bcd· A·aAbI5=GO(I2,c)I10=GO(I6,b) A·ab Bc·Bd AaAb·I1=GO(I0,S) B·cBdI11=GO(I8,d) S'S· B·cBd BcBd·I2=GO(I0,A) Bc·d SA·BI6=GO(I3,A) B·cBd AaA·b B·cd GO(I3,a)=I3I3=GO(I0,a)I7=GO(I3,b) Aa·Ab Aab· Aa·bI8=GO(I5,B) A·aAb BcB·d A·ab GO(I5,c)=I5上述状态集没有移进归约冲突,(a)是SLR文法,分析表如下:abcd$SAB0S3121acc2S543S3S764r15S5S986S107r5r58S119r3r310r4r411r2r210-10解:(1)FIRSTVT(P)=A,(LASTVT(P)=a,) FIRSTVT(F)=aLASTVT(F)=a(2)优先关系表:习题1111-1解:11-3解: 推导树如下:(1)EiE·VAL=B设四元式初始编号ip=100(2)EiE·VAL= C(3)E-EE·VAL=T1(101)(,c,-,T1)(4)EiE·VAL=D(5)EE+EE·VAL=T2(101)(+,T1,D,T2)(6)EE*EE·VAL=T3(103)(*,B,T2,T3)(7)Si:=E(104)(:=,T3,-,A)11-4解:结果为333645211。11-5解:(1)E1C<DE1·F=101(100)(<,C,D,102)(2)WwhileW·code=102(101)(j,-,-,103)(3)E2A>BE2·F=103(102)(>,A,B,104)(4)E1E*EE1·VAL=T1(103)(j,-,-,0)(5)E2E+EE2·VAL=T2(104)(*,2,z.T1)(6)Ai:=E2A·chain=0(105)(+,y,T1,T2)(7)SAS1·chain=0(106)(:=,T2,-,x)(8)SWS1S1·chain=103(107)(j,-,-,102)(9)Sif E1 thenS1S·chain=101习题12回边749110712-1解:(a)基本块程序流图B1 (1)(3)B2 (4)B3 (5)B4 (6)B5 (7)(8)B6 (9)B7 (10)(11)B8 (12)(13)B9 (14)(15)B10 (16)(17)(b)必经结点D(1)=1D(2)=1,2D(3)=1,3D(4)=1,3,4D(5)=1,3,4,5D(6)=1,3,4,6D(7)=1,3,4,7D(8)=1,3,4,7,8D(9)=1,3,4,7,8,9D(10)=1,3,4,7,8,10由回边74组成的循环7,4,5,6,8,10。(3)优化结果(3) B:=10(4) A:=A+8(5) if B100 then goto (8)(6) B:=B+10(7) goto (4)(8) write A12-2解:(1)基本块(2)程序流图 B1 (1)(3) B2 (4)(5) B3 (6)(7) B4 (8)12-7解:MOVbR0ADDR0cMOVaR1SVBR1R0MOVR0t1MOVdR0ADDR01MOVR1t2MOVeR1MVLR1fADDR0R1MOVt2R1DIVR1R012-8解:abcdefB1122211B212111B312212B422211B5111122698637分配给b, c, f,执行代价最省。13-2解:当运行到C调用B时,活动记录栈的状态如下图。13-4解:静态作用域规则下输出 0.250 0.250 0.250 0.250动态作用域规则下输出 0.250 0.125 0.250 0.1257-6解:设x, y, z对应的形式单元为J1(和J'1),J2(和J'2),J3(和J'3)。1. 引用调用A:=2B:=3T:=A+B(T的值为5)J1:=T的地址J2:=A的地址J3:=A的地址J2:=J2+1(A的值为3)J3:=J3+J1(A的值为3+5=8)打印A的值为8。2. 传值A:=2B:=3T:=A+B(T的值为5)J1:=T(J1的值为5)J2:=A(J2的值为2)J3:=A(J3的值为2)J2:=J2+1(J2的值为3)J3:=J3+J1(J3的值为7)打印A的值为2。3. 结果调用形式单元J1, J2, J3无初始化值,计算是不确定的,打印A的值仍为2。4. 传值得结果A:=2B:=3T:=A+B(T的值为5)J1:=T(J1的值为5)J'1:=T的地址J2:=A(J2的值为2)J'2:=A的地址J3:=A(J3的值为2)J'3:=A的地址J2:=J2+1(J2的值为3)J3:=J3+J1(J3的值为7)J'3:=J1(T的值为5,未变)J'2:=J2(A的值为3)J'3:=J3(A的值为7)打印A的值为7。5. 名调用计算时用实参原文替换形参A:=2B:=3B:=A+1 (A替换y, A的值为3)A:=A+A+B(A的值为9)打印A的值为9。