1、第二章 高级语言的语法描述6、令文法 G6 为:N D|NDD 0|1|2|3|4|5|6|7|8|9(1)G 6 的语言 L(G 6)是什么?(2)给出句子 0127、34 和 568 的最左推导和最右推导。解答:思路:由 N D|ND 可得出如下推导 NNDNDDD n(n=1) 可以看出,N 最终可以推导出 1 个或多个(也可以是无穷)D,而 D 0|1|2|3|4|5|6|7|8|9可知,每个 D 为 09 中的任一个数字,所以,N 最终推导出的就是由 09 这 10 个数字组成的字符串。(1)G 6 的语言 L(G 6)是由 09 这 10 个数字组成的字符串,或0,1,9 +。(2
2、)句子 0127、34 和 568 的最左推导分别为:NNDNDDNDDD DDDD0DDD01DD012D0127NNDDD3D34NNDNDDDDD 5DD56D568句子 0127、34 和 568 的最右推导分别为:NNDN7ND7 N27ND27N127D1270127NNDN4D434NNDN8ND8 N68D685687、写一个文法,使其语言是奇数集,且每个基数不以 0 开头。解答:G(S): S CD|D D1|3|5|7|9C CB|A A2|4|6|8|DB A|0或:G(S): S MWN|N N 1|3|5|7|9 M 1|2|3|4|5|6|7|8|9W WV| V
3、M|08、令文法为 :ET|E+T|E-TTF|T*F|T/FF(E)|i(1)i+i*i、i*(i+i)的最左推导和最右推导;(2)给出 i+i+i、i+i*i 和 i-i-i 的语法树。解答:(1)i+i*i、i*(i+i)的最左推导分别为:ETE+TF+Ti+Ti+T*Fi+F*Fi+i*Fi+i*iETT*FF*Fi*Fi*(E)i*(E+T)i*(T+T)i*(F+T)i*(i+T)i*(i+F)i*(i+i)i+i*i、i*(i+i)的最右推导分别为:ETE+TE+T*FE+T*iE+F*iE+i*iT+i*iF+i*ii+i*iETT*FT*(E+T)T*(E+F)T*(E+i)
4、T*(T+i)T*(F+i)T*(i+i)F*(i+i)i*(i+i)(2) E E EE + T E + T E - TT T * F T T * F E - T FF F i F F i T F ii i i i F ii+i+I i+i*ii i-i-i 9、证明下面的文法是二义的: SiSeS|iS|i证明:思路:要证明该文法是二义的,必须找到一个句子,使得该句子具有两个不同的最右推导或两个不同的语法树。对于句子 iiiei,存在如下两个最右推导:SiSeSiSeiiiSeiiiieiSiSiiSeSiiSeiiiiei由此,该文法是二义的。10、把下面文法改写为无二义的:SSS|(S
5、)|()解答:思路:对于句子() () () ,存在如下两棵语法树,所以该文法是二义性文法,引起S SS S S SS S ( ) ( )S S( ) ( ) ( ) ( )二义性的原因在于 SSS,可将其改造成等价的递归结构,消除二义性。改造后的文法为:STS|T T(S)|()11、给出下面语言的相应文法: L1=a nbnci|n=1,i=0L2=aibncn|n=1,i=0L3=anbnambm|n,m=0L4=1n0m1m0n|n,m=0解答: 分析:L1:要求 a 和 b 的个数一样多,并至少为 1 个,c 的个数为 0 个以上,可用一个非终结符去生成 anbn 串,一个非终结符生
6、成 ci;L2 同 L1。L3:将 anbnambm分为两段考虑, a nbn和 ambm,然后使用两个终结符分别产生。L4:采用从里往外扩展的方式,先用一个非终结符生成中间的 m 个 0 和 m 个 1,然后,再用另一个非终结符在该串的基础上扩充前后的 n 个 0 和 n 个 1。L1 的文法: SAC AaAb|ab CCc|L2 的文法: SAB AAa| BbBc|bcL3 的文法: SAB AaAb| BaBb|L4 的文法: S1A0|A A0A1|第三章 词法分析7、构造下列正规式相应的 DFA:(1) 1(0|1) *101 (2) 1(1010*|1(010)*1)*0 (3
7、) 0*10*10*10*解答:(1)第 1 步:根据正规式构造 NFA,引入初态 X 和终止态 Y。(2)第 2 步:对上 NFA 进行确定化,得到如下状态转化矩阵。状态 I0 I1X 1,2,31,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根据上面的状态转换矩阵,重新命名,得到相应的 DFA(3)第 3 步 化简该 DFA,获得最简的 DFA,即为所求的 DFA。首先初始分为终态集和非终态集两个集合:0,1,2,3,4和5考察0,1,2,3,40,1,2,3,40 = _ 2
8、,4 0 状态不能接受 0 字符 ,0 把0,1,2,3,4分为0,1,2,3,4考察1,2,3,41,2,3,40=2,4,2 和 4 目前等价,1,2,3,41=3,5 ,3 和 5 不等价1 把1,2,3,4分为1,2,3和4考察1,2,31,2,30=2,4,2 和 4 不等价,所以1,2,3可分为1,2,3考察1,21,20=2 1,21=3 1,2不可再细分最终分为 5 个小组:0,1,2,3,4,5x 11 210 3 1 4 0 5 1 y0 1011204 51100031 1保留状态 1,删除状态 2,1 状态经 0 弧到 2,改为 1 经 0 到 1;4 经 0 到 2,
9、改为 4 经 0 到 1为化简后的 DFA 为8、给出下面正规表达式:(1)以 01 结尾的二进制数串;(2) 能被 5 整除的十进制整数;(3)包含奇数个 1 或奇数个 0 的二进制数串;解答:分析:(1)分两部分考虑,一部分实现由 0 和 1 构成的任意串,一部分 01,两部分连接到一起就可以了。本题答案为(0|1) *01(2)要求由 09 这 10 个数字组成的字符串,并且不能以 0 开头,要能被 5 整除。要被 5 整除则需以 0 或 5 结尾。分两种情况考虑,一是 1 位整数,那么该整数是 0 和 5;另外一种情况是多位整数。分 3 部分考虑:末尾必须是 0 或 5,第 1 位必须
10、不为0,中间部分任意。本题答案为(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9) *(0|5)|(0|5)(3)12、将图 3.18 的(a)和(b)分别确定化和最少化。解答:(a) (b)解答:(1) a 图是一个 NFA,要对它进行确定化。第 1 步:确定化,得到 DFA。3 4100 1121 110001a0 a,baa0ba21 4ba53bbbbaaa确定化后得到的状态转换矩阵为下图:状态 Ia Ib0 0,1 10,1 0,1 11 0 给状态重新编号,得到新的状态转换矩阵:状态 Ia Ib0+- 1 21- 1 22 0 第 2 步:最小化首先将
11、状态划分为两个集合0,1和20,1a=1 0,1b=2 不可再分取状态 0 做代表,删除 1得到新的 DFA,(2)图 b 所示为一 DFA,需要把它进行最小化。首先将状态初始划分为终态集和非终态集两部分:2,3,4,5,0,1首先考察处理0,10,1a=1 0,1b=2,4, 2 和 4 等价,2,4目前不可再分考察处理2,3,4,52,3,4,5a=1,3,0,5 1,0 和 3,5 是可区别的, 2,3,4,5可细分为2,4,3,5考察2,42,4a=0,1 2,4b=3,5 0 和 1, 3 和 5 等价, 2,4不可再分3,5a=3,5 3,5b=2,4 2 和 4, 3 和 5 等
12、价, 3,5不可再分最终分组为0,1 2,4 3,50 12aabab0 2baa取 0,2,3 做为代表,删除 1,4,5最小化后的 DFA 为:14.构造一个 DFA,它接受=0,1上满足如下条件的字符串:每个 0 都有 1 直接跟在右边。解答:第 1 步:写出正规式,为(0|10) *。第 2 步:构造 NFA。第 3 步:确定化。状态转换矩阵为:状态 I0 I1X,0,Y 0,Y 10,Y 0,Y 11 0,Y 重命名的状态转换矩阵为:状态 I0 I10+- 1 21- 1 22 1 化简后的 DFA 为:0 2 3b bb aaa0X Y 11 000 1200110第 4 步:对该
13、确定化后的 DFA 进行最小化。首先初始划分为:0,1,2考察0,10,10=1 0,11=2 所以0,1不可再细分保留 0,删除 1 后,得到化简后的 DFA 即为所求得的 DFA。15.给定右线性文法 G:S0S|1S|1A|0BA1C|1B0C|0C0C|1C|0|1求出一个与 G 等价的左线性文法。解答:分析:将右线性文法改为左线性文法,没有直接的方法,可以通过状态转换图来实现.先求得右线性文法对应的 NFA,即状态转换图,然后确定化为 DFA,再根据 DFA,求出左线性文法。第 1 步:求文法 G 所对应的 NFA.如下图第 2 步:对该 NFA 进行确定化和最小化状态转换矩阵为:状
14、态 I0 I1S S,B S,AS,B S,B,C,T S,AS,A S,B S,A,C,TS,B,C,T S,B,C,T S,A,C,TS,A,C,T S,B,C,T S,A,C,T重命名后的状态转换矩阵为:0 201000,1ABCTS1,0,1,1,0,0,0,10,1状态 I0 I10+ 1 21 3 22 1 43- 3 44- 3 4确定化后的 DFA 为最小化:初始划分为:0,1,2,3,4考察3,43,40=3 3,41=4 3,4不可再分.考察0,1,20,1,20=1,3 0,1,2可再分为0,2和1考察0,20,21=2,4 0,2可再分为0和2最终分组为:0,1,2,3
15、,4保留 3,删除 4最小化后的 DFA 为:根据该 DFA,与它对应的左线性文法为:T A1|B1|T0|T1A B0|0B A1|10 120,1,0,1, 0, 430,1,1,1,0,S AB T01,1,0,0,1,0,1第四章 自上而下语法分析1.考虑下面文法 G1:Sa|(T)TT,S|S(1)消去 G1 的左递归.然后对每个非终结符,写出不带回溯的递归子程序。(2)经改写后的文法是否是 LL(1)的?给出他的预测分析表。解答:(1)消去左递归后:Sa|(T)TSTT ,ST|(2)计算每个非终结符的 FIRST 集合和 FOLLOW 集合:FIRST(S)=a,(FIRST(T
16、)= a,(FIRST(T)=, FOLLOW(S)=,#FOLLOW(T)= )FOLLOW(T)= )预测分析表如下:a ( ) , #S Sa S S(T)T TST TST TSTT T T ,ST构造的预测分析表中没有多重入口,所以改造后的文法是 LL(1)文法。2.对下面的文法 G:ETEE+E|TFTT T|FPFF *F|P(E)|a|b|(1)计算这个文法的每个非终结符的 FIRST 和 FOLLOW 集合。(2)证明这个文法是 LL(1)的。(3)构造它的预测分析表。(4)构造它的递归下降分析程序。解答:(1)计算每个非终结符的 FIRST 集合和 FOLLOW 集合:FI
17、RST(E)= (,a,b,FIRST(E)=+,FIRST(T)= (,a,b,FIRST(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,,),#,+对于产生式 E+E| FIRST(+E)=+ FOLLOW(E)= ),# ,交集为空;产生式 T T| FIRST(T)= (,a,b,
18、FOLLOW(T)= ),#,+ ,交集为空 ;产生式 F *F| FIRST(*F)=* FOLLOW(F)= (,a,b,,),#,+,交集为空; 产生式 P(E)|a|b| FIRST(E)=( FIRST(a)=a FIRST(b)=b FIRST()= 交集为空,由上可知满足 LL(1)分析条件,该文法是 LL(1)的。(3)预测分析表为:+ * ( ) a b E ETE ETE ETE ETEE E+E E ET TFT TFT TFT TFTT T T T T T T T T T T T F FPF FPF FPF FPFF F F *F F F F F F F P P(E)|
19、a|b|P(E)|a|b|P(E)|a|b|P(E)|a|b|3下面文法中,哪些试 LL(1)的,说明理由。(1)SAbc Aa| Bb|(2) SAb Aa|B| Bb|(3) SABBA Aa| Bb|(4) SaSe|B BbBe|C CcCe|d解答:(1)FIRST(S)=a,b 对于 Aa| FIRST(a)=a FIRST()= FOLLOW(A)=b 交集为空Bb| FIRST(b)=b FIRST()= FOLLOW(B)=c 交集为空 由上可知,满足 LL(1)分析条件,所以该文法是 LL(1)文法。(2)FIRST(S)=a,b,对于 Aa|B| FIRST(a)=a F
20、IRST(B)=b, FIRST()= FOLLOW(A)=b而 FIRST(B)FOLLOW(A)=b对于 Bb| FIRST(b)=b FIRST()= FOLLOW(B)=b 而 FIRST(b) FOLLOW(B)=b不满足 LL(1)分析条件,所以该文法不是 LL(1)文法。(3)FIRST(ABBA)=a, 对于 Aa| FIRST(a)=a FIRST()= FOLLOW(A)=b,a而 FIRST(a)FOLLOW(A)=a对于 Bb| FIRST(b)=b FIRST()= FOLLOW(B)=b,a而 FIRST(b) FOLLOW(B)=b不满足 ll(1)分析条件,所以
21、该文法不是 ll(1)文法。(4)对于 SaSe|B FIRST(aSe)=a FIRST(B)=b,c,d 交集不为空;对于 BbBe|C FIRST(bBe)=b FIRST(C)=c,d 交集不为空;对于 CcCe|d FIRST(cCe)=c FIRST(d)=d 交集不为空。满足 ll(1)分析条件,所以该文法是 LL(1)文法。第五章 语法分析-自下而上分析1.令文法 G1 为:EE+T|TTT*F|FF(E)|i证明 E+T*F 是它得一个句型,指出这个句型的所有短语,直接短语和句柄。解答:因为对于 E+T*F,其对应的语法树为:E E + T T T * F 所以 E+T*F
22、是句型.T 是句型 E+T*F 相对于 E 的短语T*F 是句型 E+T*F 相对于 T 的短语E+T*F 是句型 E+T*F 相对于 E 的短语T,T*F 是直接短语,T 是句柄。2.考虑下面的表格结构文法 G2:Sa|(T)TT,S|S(1)给出(a,(a,a)和(a,a),(a),a)的最左和最右推导。(2)指出(a,a),(a),a)的规范规约及每一步的句柄,根据这个规范规约,给出”移进-规约”的过程,并给出它的语法树自下而上的构造过程。解答:(1)最左推导:S=(T)=(T,S)=(S,S)=(a,S)=(a,(T)=(a,(T,S)=(a,(S,S)=(a,(a,S)=(a,(a,
23、a)S=(T)=(T,S)=(S,S)=(T),S)=(T,S),S)=略3 (1)计算练习 2 文法 G2 的 FIRSTVT 和 LASTVT。(2)计算 G2 的优先关系。 G2 是一个算符优先文法吗?(3)给出输入串(a,(a,a))的算符优先分析过程。解答:(1)各个终结符的 FIRSTVT 和 LASTVT 集合: FIRSTVT(S)=a, (FIRSTVT(T)=, ,a, ( LASTVT(S )= a , )LASTVT(T)=, ,a,)(2) 构造优先关系表为a ( ) , #a ( , # 100 goto L2haltL2: F:=F-1Goto L1read CA
24、:=0B:=1L1:A:=A+BIf BC goto L2L2:write AHaltB:=B+1goto L1解答:可划分如下基本块read A,BF:=1C:=A*A B1D:=B*Bif C100 goto L2halt B4L2: F:=F-1Goto L1 B53.试对以下基本块 B1 和 B2:B1: B2:A:=B*C B:=3D:=B/C D:=A+CE:=A+D E:=A*CF:=2*E F:=D+EG:=B*C G:=B*FH:=G*G H:=A+CF:=H*G I:=A*CL:=F J:=H+IM:=L K:=B*5L:=K+JM:=L分别应用 DAG 对他们进行优化,并
25、就以下两种情况分别写出优化后的四元式序列:(1)假设只有 G,L,M 在基本块后面还要被引用;(2)假设只有 L 在基本块后面还要被引用。解答:基本块 B1 的 DAG 图为:B1B2 B3B4 B5假设只有 G,L,M 在基本块后面还要被引用, B1 优化后的中间代码为:G:=B+C H:=G*GL:=H*GM:=L假设只有 L 在基本块后面还要被引用,则 B1 优化后的中间代码为:G:=B+C H:=G*GL:=H*G基本块 B2 的 DAG 图为:假设只有 G,L,M 在基本块后面还要被引用, B2 优化后的中间代码为:D:=A+BE:=A*BF:=D+EG:=3*FL:=F+15M:=
26、L假设只有 L 在基本块后面还要被引用,则 B2 优化后的中间代码为:D:=A+C E:=A*C F:=D+E L:=F+15n1B0n2B C0n3*nA 4/A,G Dn5+E n62n7*n8*HFn9*F,L,Mn13Bn2A0n3C0n4+n5*D,H E,In6+F,Jn7*Gn815Kn9+L,M第十一章 目标代码生成1对以下中间代码序列 C:T1:=B-CT2:=A*T1T3:=D+1T4:=E-FT5:=T3*T4W:=T2/T5假设可用寄存器为 R0 和 R1,W 是基本块出口的活跃变量,用简单代码生成算法生成其目标代码,同时列出代码生成过程中的寄存器描述和地址描述。解答:
27、生成的目标代码、寄存器描述和地址描述如下:中间代码 目标代码 寄存器描述 地址描述T1:=B-C LD R0,BSUB R0,CR0 含 T1 T1 在 R0T2:=A*T1 LD R1,AMUL R1,R0R0 含 T1R1 含 T2T1 在 R0T2 在 R1T3:=D+1 LD R0,DADD R0,#1R1 含 T2R0 含 T3T2 在 R1T3 在 R0T4:=E-F ST R1,T2LD R1,ESUB R1,FR0 含 T3R1 含 T4T3 在 R0T4 在 R1T2 在内存T5:=T3*T4 MUL R0,R1 R1 含 T4R0 含 T5T4 在 R1T2 在内存T5 在
28、 R0W:=T2/T5 LD R1,T2DIV R1,R0ST R1, WR0 含 T5R1 含 WT5 在 R0W 在内存和 R12对以下中间代码序列:T1:=A+BT2:=T1-CT3:=D+ET3:=T2*T3T4:=T1+T3T5:=T3-EF:=T4*T5(1)应用 DAG 结点排序算法重新排序;(2)假设可用寄存器为 R0,F 是基本块出口处的活跃变量,应用简单代码生成算法分别生成排序前后的中间代码序列的目标代码,并比较其优劣。解答:(1)设原中间代码序列为 G,则 G 的 DAG 图为:由上可知 DAG 图有 7 个内部结点,根据结点重新排序算法,将内部结点进行排序,为:n3,n
29、1,n2,n4,n6,n5,n7按照该顺序将中间代码进行改写得到 G:T3:=D+ET1:=A+BT2:=T1-CT3:=T2*T3T5:=T3-ET4:=T1+T3F:=T4*T5(2)G 和 G的目标代码分别为:(1)LD R0,A (1) LD R0,D(2) ADD R0,B (2) ADD R0,E(3) ST R0,T1 (3) ST R0,T3(4) SUB R0,C (4) LD R0,A(5) ST R0,T2 (5) ADD R0,B(6) LD R0,D (6) ST R0,T1(7) ADD R0,E (7) ADD R0,C(8) ST R0,T3 (8) MUL R
30、0,T3(9) LD R0,T2 (9) ST R0,T3(10) MUL R0,T3 (10) SUB R0,E(11) ST R0,T3 (11) ST R0 T5(12) LD R0,T1 (12) LD R0,T1(13) ADD R0,T3 (13) ADD R0,T3(14) ST R0,T4 (14) MUL R0,T5(15) LD R0,T3 (15) ST R0,F(16) SUB R0,E G的目标代码比 G 的目标代码短,少 5 条指令,说明结点重排后得到代(17) ST R0,T5 码更优化,更高效。(18) LD R0,T4A0 B0n1+T1C0n2-T2D0 E0n3T3n4*T3n5+T4 n6T5n7*F(19) MUL R0,T5(20) ST R0,F