资源描述:
《编译原理基础——习题与上机题解答 教学课件 作者 刘坚 第1-5章第4章.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第4章“语法制导翻译生成中间代码”习题解答4.1将下述语句分别翻译成后缀式、三元式、三地址码和树。(1)a*–(b+c)(2)–(a+b)*(c+d)+(a+b–c)(3)ifi<10theni:=10elsei:=0解:(1)后缀式:abc+–*三元式:①(+,b,c)②(@,①,)③(*,a,②)三地址码:T1:=b+c;T2:=-T1;T3:=a*T2;树如题4.1图1所示。(2)后缀式:ab+–cd+*ab+c–+三元式:①(+,a,b)⑤(+,a,b)②(–,①,)⑥(–,⑤,c)③(+,c,d)⑦(+,④,⑥)④(*,②,③)三地址码:T
2、1:=a+b;T2:=–T1;T3:=c+d;T4:=T2*T3;T5:=a+b;T6:=T5–c;T7:=T4+T6;树如题4.1图2所示。题4.1图2(3)后缀式:i103、引用中属于哪个声明的作用域,并给出程序运行的结果。programa(input,output);(1)procedureb(u,v,x,y:integer);(2)vara:recorda,b:integerend;(3)b:recordb,a:integerend;(4)begin(5)withadobegina:=u;b:=vend;(6)withbdobegina:=x;b:=yend;(7)writeln(a.a,a.b,b.a,b.b)(8)end;(9)beginb(1,2,3,4)end.(10)解:续表运行结果:1234。4.4假定下
4、述程序分别采用值调用、引用调用、复写-恢复和换名调用,请给出它们的打印结果。programmain(input,output);procedurep(x,y,z);beginy:=y+1;z:=z+xend;begina:=2;b:=3;p(a+b,a,a);printaend.解: 引用调用和复写—恢复要求实参是左值,若实参为表达式,则可以有两种解决方案:①语法错;②为表达式分配一个临时变量t并将表达式的值放进t,然后将t看作实参,进行相应的参数传递。若按第二种解决方案,则值调用结果:2; 引用调用结果:8; 复写-恢复调用结果:7;
5、 换名调用结果:9。4.5对于例4.14中的Pascal程序,若以线性表方式组织符号表,请给出分析到第(14)行时符号表的状态。 解: 当程序分析到第(14)行时,符号表中可以被访问到的变量如下,它们是以栈的形式组织的,栈顶元素是partition中的j。程序中变量i出现在3个过程(readarray、quicksort、partition)中,当前状态已经出了readarray的作用域,因此readarray中的i不在当前符号表中,而在符号表中的两个i,仅有partition中的i可以被访问到。4.7简单赋值语句x:=–(a+b)*(c+
6、d),其中x、a、c是整型,b、d是实型。根据教材中提供的翻译方案,生成它的中间代码序列(给出分析树和主要的分析过程)。 解: 带注释的分析树如题4.7图所示。题4.7图分析过程如下:由于语法制导翻译的基础是语法分析,因此这类习题的具体做法应该是:首先根据文法画出所给语句的分析树;如果是自下而上的分析,则根据剪句柄的次序排列出剪句柄时所使用的产生式,即主要分析步骤;最后根据每个产生式后边的语义规则,记录语义处理的结果,例如文法符号的属性可以直接标记在分析树上以形成注释分析树,所产生的中间代码标记在对应产生式的右边以得到中间代码序列。4.8根据
7、教材中数组元素引用的语法制导翻译,写出赋值语句result:=a[x,y,z]的三地址码序列,其中的三维数组声明为a[10,20,30]。 解: 设每个数组元素占据一个存储单元(即w=1)。语句result:=a[x,y,z]的注释分析树(见题4.8图)和由剪句柄所得的主要分析步骤分别如下:续表题4.8图4.9设整型数组声明的形式为intA[d1,d2,…,dn],并且假设每个整型数占据4个字节。(1)试导出以列为主存储时计算c和v的递推公式。 解: 设数组的首地址为a,引用数组元素A[i1,i2,…,in]的公式如下:n=1时,A[
8、i1]的地址为addr(A[i1])=a+(i1–1)*4;n=2时,A[i1,i2]的地址为addr(A[