编译原理教程课后习题答案——第四章
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第四章语义分析和中间代码生成
4.1完成下列选择题:
(1) 四元式之间的联系是通过一实现的。
d.程序变量
(2) ____________________________ 间接三元式表示法的优点为 。
a. 采用间接码表,便于优化处理
b. 节省存储空间,不便于表的修改
c. 便于优化处理,节省存储空间
d. 节省存储空间,不便于优化处理
(3) _________________________________________ 表达式6 AVB) A(CV D)的逆波兰表示
为 __________________________________________________ °
a. n AB VA CD V
b. A n B V CD VA
c. AB Vn CD VA
d. A n B VA CDV (4)有一语法制导翻译如下所示: ST bAb
{print 〃 T } AT(B
ATa
{print // 2 〃 } {print 〃 3 〃 } BT Aa)
{print 〃 4〃 } 若输入序列为b(((aa)a)a)b ,且采用自下而上的分析方法,则输出序列为 __________
a.32224441
b.34242421
c.12424243
d.34442212
【解答】
(1) b (2)a (3)b (4)b
4.2何谓语法制导翻译” ?试给出用语法制导翻译生成中间代码的要点,并用一简例予以说
明。
【解答】语法制导翻译(SDTS)直观上说就是为每个产生式配上一个翻译子程序
(称语义动作或语义子程序),并且在语法分析的同时执行这些子程序。也即在语法分析过程中,当一 个产生式获得匹配 (对于自上而下分析)或用于归约(对于自下而上分析)时,此产生 式相应的语义子程序进入工作,完成既定的翻译任务。
用语法制导翻译(SDTS)生成中间代码的要点如下:
(1) 按语法成分的实际处理顺序生成,即按语义要求生成中间代码。
(2) 注意地址返填问题。
(3) 不要遗漏必要的处理,如无条件跳转等。
例如下面的程序段:
if (i>0) a=i+e-b*d; else a=0;
在生成中间代码时,条件 卜0”为假的转移地址无法确定,而要等到处理
else”时方可确 定,这时就存在一个地址返填问题。此外,按语义要求,当处理完
(i>0)后的语句(即i>0”为
a. 指示器b •临时变量
c.符号表
真时执行的语句)时,则应转出当前的if语句,也即此时应加入一条无条件跳转指令,并且这个转移地址也需要待处理完else之后的语句后方可获得,就是说同样存在着地址返填问
题。对于赋值语句a=i+e-b*d,其处理顺序(也即生成中间代码顺序)是先生成i+e的代码,再生成3d
【解答】为使过程调用语句的语义子程序产生的参数四元式par按反序方式出现,过程调
用语句的文法为
St call i(arglist) arglisttE arglisttarglist(1),E
按照该文法,语法制导翻译程序不需要语义变量队列queue,但需要一个语义变量
栈STACK,用来实现按反序记录每个实在参数的地址。翻译过程调用语句的产生式及语义子程序如下:
(1) arglistTE {建立一个arglist.STACK 栈,它仅包含一项 E.place}
(2) arglist T arglist⑴,E {将E.place 压入arglist(1). STACK 栈,arglist.
STACK=arglist(l).STACK}
(3) ST call i (arglist) {while arglist.STACK 丰 null do
begin
将arglist.STACK栈顶项弹出并送入p单元之中;
emit (par,_ ,_,p);
en d;
emit (call,_ , entry (i));}
4.6设某语言的while语句的语法形式为
ST while E do S(1)
其语义解释如图4・1所示。
(1) 写出适合语法制导翻译的产生式;
(2) 写出每个产生式对应的语义动作。
图习题4.6的语句结构图
【解答】本题的语义解释图已经给出了翻译后的中间代码结构。在语法制导翻译过程中,
当扫描到while时,应记住E的代码地址;当扫描到do时,应对E的真出口”进行回填,使之转到S(1)代码的入口处;当扫描到S(1)时,除了应将E的入口地址传给S(1).chain之外,还要形成一个转向E入口处的无条件转移的四元式,并且将E.fc继续传下去。因此,应把S
Twhile E do S(1)改写为如下的三个产生式:
W T while
ATW E do
STAS(1)
每个产生式对应的语义子程序如下:
W T while
{W.quad=nxq;}
ATW E do
{ Backpatch(E.tc, nxq); A.cha in=E.fc;
A.quad=W.quad;}
STAS(1)
{ Backpatch(S(1 ).chai n, A.quad);
emit(j,_,_,A.quad);
S.chai n=A.chai n;}
4.7改写布尔表达式的语义子程序,使得i(1) rop i(2)不按通常方式翻译为下面的相继两个四元
式:
(jrop, i(1), i(2), 0)
(j,_,0)而是翻译成如下的一个四元式:
(jnrop, i(1), i(2), 0)
使得当i(1) rop i(2)为假时发生转移,而为真时并不发生转移(即顺序执行下一个四
元式),从而产生效率较高的四元式代码。
【解答】按要求改造描述布尔表达式的语义子程序如下:
(1) E T i {E.tc=null;E.fc=nxq;emit(jez,entry(i)J_ ,0);}
(2) E T i (i) rop i(2) {E.tc=null;E.fc= nxq;emit(j nrop,e ntry(i(1 )),e ntry(i(2));) 广nrop表示矢系运算符与rop 相反*/
(3) Et(E(1))
⑷ ETE(1){E.tc=E(1).tc; E.fc=E(1).fc;}
{E.fc=nxq;emit(j,_,_ ,0);Backpatch(E(1 ).fc,nxq);}
(5) EA T E⑴ A {EA.fc=E(1).fc;}
(6) EtEAE(2) {E.tc=E(2).tc;E.fc=merg(EA.fc,E(2).fc);}
(7) EOT E(1) V {E0.tc=nxq;emit(j,_ ,_ ,0);Backpatch(E(1 ).fc,nxq);}
(8) EtE0E(2) {E.fc=E(2).fc;Backpatch(E0.tc,nxq);}
4.8按照三种基本控制结构文法将下面的语句翻译成四元式序列:
while (A if (A>1)C=C+1; else while (A < D) A=A+2; 【解答】该语句的四元式序列如下(其中E1、E2和E3分别对应AvCABvD、A〉1和A wD,并且尖系运算符优先级高): 100 (j<,A,C,102) 101 (j,_,_,113)/*E1为F7