文档库

最新最全的文档下载
当前位置:文档库 > 编译原理教程课后习题答案——第四章

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

第四章语义分析和中间代码生成

4.1 完成下列选择题:

(1) 四元式之间的联系是通过实现的。

a. 指示器

b. 临时变量

c. 符号表

d. 程序变量

(2) 间接三元式表示法的优点为。

a. 采用间接码表,便于优化处理

b. 节省存储空间,不便于表的修改

c. 便于优化处理,节省存储空间

d. 节省存储空间,不便于优化处理

(3) 表达式(┐A∨B)∧(C∨D)的逆波兰表示为。

a. ┐AB∨∧CD∨

b. A┐B∨CD∨∧

c. AB∨┐CD∨∧

d. A┐B∨∧CD∨

(4) 有一语法制导翻译如下所示:

S→bAb {print″1″}

A→(B {print″2″}

A→a {print″3″}

B→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;

在生成中间代码时,条件“i>0”为假的转移地址无法确定,而要等到处理“else”时方可确定,这时就存在一个地址返填问题。此外,按语义要求,当处理完(i>0)后的语句(即“i>0”为真时执行的语句)时,则应转出当前的if语句,也即此时应加入一条无条件跳转指令,并且这个转移地址也需要待处理完else之后的语句后方可获得,就是说同样存在着地址返填问题。对于赋值语句a=i+e-b*d,其处理顺序(也即生成中间代码顺序)是先生成i+e的代码,再生成b*d的中间代码,最后才产生“-”运算的中间代码,这种顺序不能颠倒。

4.3 令S.val为文法G[S]生成的二进制数的值,例如对输入串101.101,则S.val=

5.625。按照语法制导翻译方法的思想,给出计算S.val的相应的语义规则,G(S)如下:

G[S]: S→L.L|L