编译原理教程课后习题答案——第四章

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档