第四章课后习题及解析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【解答】 此题只需要对说明语句进行语义分析而不需要 产生代码,但要求把每个标识符的类型填入符号表中。对 D、 L、 T,为其设置综合属性 type,而过程 enter(name,type)用来把名字 name 填入到符号表中,并且给出此名字的类型 type。翻译方案 如下: D→id L {enter (id.name, L.type);} L→,id L (1) {enter (id.name, L(1).type); L.type=L (1).type;} L→:T {L.type=T.type;} T→integer {T.type=integer;} T→real {T.type=real;}
第四章 语义分析和中间代码生成
102 (j<,B,D,104) 103 (j,_,_,113) 104 (j=,A,1,106) 105 (j,_,_,108) 106 (+, C, 1, C) 107 (j,_,_,112) 108 (j≤,A,D,110) 109 (j,_,_,112) 110 (+, A, 2, A) 111 (j,_,_,108) 112 (j,_,_,100) 113 //E1 为 T //E1 为 F //E2 为 T //E2 为 F //C:=C+1 //跳过 else 后的语句 //E3 为 T //E3 为 F //A:=A+2 //转回内层 while 语句开始处 //转回外层 while 语句开始处
(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的中间代码,最
第四章 语义分析和中间代码生成
【解答】 计算 S.val 的文法 G ′ [S]及语义动作如下: G′ [S]: 产生式 S′ →S S→L1·L2 S→L L→L1B L→B B→1 B→0 语义动作 {print(S.val)} {S.val:=L1.val + L2.val/2L2.length} { S.val:=L.val } {L.val:=L 1.val*2 + B.val L.length:=L1.length +1} {L.val:=B.val L.length:=2} {B.val:=1} {B.val:=0}
第四章 语义分析和中间代码生成
4.4 下面的文法生成变量的类型说明: D→id L L →,id L | :T T →integer | real 试构造一个翻译方案,仅使用综合属性,把每个标识符的类型 填入符号表中(对所用到的过程,仅说明功能即可,不必具体写 出)。
第四章 语义分析和中间代码生成
第四章 语义分析和中间代码生成
按照该文法,语法制导翻译程序不需要语义变量队列 queue,但需要一个语义变量栈 STACK,用来实现按反序记录 每个实在参数的地址。 翻译过程(函数)调用语句的产生式及语义 子程序如下: (1) arglist→E 仅包含一项 E.place} (2) arglist→arglist ,E 栈, arglist. STACK=arglist .STACK} (3) S→call i (arglist)
(2) 0 A (1)
第四章 语义分析和中间代码生成
4.8 按照三种基本控制结构的文法将下面的语句翻译成四 元式序列: while (A<C∧B<D) { if (A≥1) C=C+1; else while (A≤D) A=A+2; } 【解答】 该语句的四元式序列如下(其中 E1、E2 和 E3 分 别对应 A<C∧B<D、A≥1 和 A≤D,并且关系运算符优先级 高): 100 (j<,A,C,102) 101 (j,_,_,113) //E1 为 F
(1)
第四章 语义分析和中间代码生成
4.7 改写布尔表达式的语义子程序, 使得 i rop i 不按通常方 式翻译为下面的相继两个四元式: (jrop, i (1), i(2), 0) (j ,_ ,_ , 0 ) 而是翻译成如下的一个四元式: (jnrop, i (1), i(2), 0) 使得当 i(1) rop i (2)为假时发生转移,而为真时并不发生转移(即顺 序执行下一个四元式),从而产生效率较高的四元式代码。
(5) 后缀式________对应的中缀表达式是a-(-b)*c (注:
C. ab-c@*
D.ab@c*-
第四章 语义分析和中间代码生成
(6) 后缀式ab+cd+/ 可用中缀表达式________来表示。
A.a+b/c+d C.a+b/(c+d) A.ab*c+ A.语法规则 C.语义规则 B.(a+b)/(c+d) D.a+b+c/d B.abc*+ C.ab+c* D.abc+*
(1) (1)
{ 建立一个 arglist.STACK 栈, 它 { 将 E.place 压入 arglist . STACK
(1)
{while (arglist.STACK!=null do) { 将 arglist.STACK 栈
顶项弹出并送入 p 单元之中; emit (par,_ ,_ ,p); }; emit (call,_ ,_ , entry (i));}
(1) (2)
第四章 语义分析和中间代码生成
【解答】 按要求改造描述布尔表达式的语义子程序如下: (1) E→i {E.tc=null;E.fc=nxq;emit(jez,entry(i),_ ,0);} (2) E → i (1) rop
(1) (2)
i(2)
{E.tc=null;E.fc=nxq;emit(jnrop,entry(i ),entry(i ),0);} // nrop 表示关系运 算符与 rop 相反 (3) E→(E(1)) (4) E→┐E(1) (5) E →E ∧ A (2) (6) E→E E (7) E0→E(1)∨ (8) E→E E
(7) 表达式(a+b)*c的后缀表达式为________。 (8) 中间代码生成时所依据的是________。 B.词法规则 D.等价变换规则
第四章 语义分析和中间代码生成
(9) 四元式表示法的优点为________。
A.不便于优化处理但便于表的更动 B.不便于优化处理但节省存储空间 C.便于优化处理也便于表的更动 D.便于表的更动也节省存储空间 (10) 有一语法制导翻译如下所示: S→bAb A→(B A→a B→Aa) {print''1''} {print''2''} {print''3''} {print''4''}
第四章 语义分析和中间代码生成
4.5 写出翻译过程调用语句的语义子程序。在所生成的
四元式序列中,要求在转子指令之前的参数四元式par按反 序出现(与实现参数的顺序相反)。此时,在翻译过程调用语 句时,是否需要语义变量queue(队列)? 【解答】 为使过程(函数)调用语句的语义子程序产生 的参数四元式par按反序方式出现,过程(函数)调用语句的文 法为 S→call i(arglist) arglist→E arglist→arglist(1),E
因此,应把S→while E do S(1) 改写为如下的三个产生式:
第四章 语义分析和中间代码生成
图4-2 习题4.6的语句结构图
第四章 语义分析和中间代码生成
W→while A→W E do S→A S 每个产生式对应的语义子程序如下: W→while { W.quad=nxq;} A→W E do { backpatch(E.tc,nxq); A.chain=E.fc; A.quad=W.quad;} S→A S(1) { backpatch(S(1).chain,A.quad); emit(j,_,_,A.quad); S.chain=A.chain;}
后才产生“-”运算的中间代码,这种顺序不能颠倒。
第四章 语义分析和中间代码生成
4.3 令S.val为文法G[S]生成的二进制数的值,例如对输
入串101.101,则S.val=5.625。按照语法制导翻译方法的思 想,给出计算S.val的相应的语义规则,G(S)如下: G[S]:S→L.L | L L→LB | B B→0 | 1
0 (2) A (1)
{E.tc=E(1).tc; E.fc=E(1).fc;} {E.fc=nxq;emit(j,_ ,_ ,0);backpatch(E(1).fc,nxq);} {E .fc=E .fc;} (2) A (2) {E.tc=E .tc;E.fc=merg(E .fc,E .fc);} {E 0.tc=nxq;emit(j,_ ,_ ,0);backpatch(E(1).fc,nxq);} {E.fc=E .fc;backpatch(E .tc,nxq);}
第四章 语义分析和中间代码生成
第四章 语义分析和中间代码生成
第四章 语义分析和中间代码生成
4.1 完成下列选择题:
(1) 中间代码的优点是 A.节省存储空间 C.编译结构在逻辑上更为简单明确 D.节省内存且编译时间短 (2) 四元式之间的联系是通过 A.指示器 C.符号表 实现的。 B.临时变量 D.程序变量 。 B.编译时间短
Leabharlann Baidu
第四章 语义分析和中间代码生成
(3) 间接三元式表示法的优点为
。
A.采用间接码表,便于优化处理 B.节省存储空间,不便于表的修改 C.便于优化处理,节省存储空间 D.节省存储空间,不便于优化处理 (4) 表达式(┐A∨B)∧(C∨D)的逆波兰表示为 A.┐AB∨∧CD∨ C.AB∨┐CD∨∧ @表示求负运算)。 A.a-b@c* B.ab@-c* 。 B.A┐B∨CD∨∧ D.A┐B∨∧CD∨
第四章 语义分析和中间代码生成
若输入序列为b(((aa)a)a)b,且采用自底向上的分析方法,则
输出序列为 。 B.34242421 D.34442212 A.32224441 C.12424243 【解答】 (1) 中间代码的优点是使编译结构在逻辑上更为简单明 确,特别是使目标代码的优化比较容易实现。故选C。 (2) 四元式之间的联系是通过临时变量实现的。故选B。 (3) 间接三元式采用间接码表,便于优化处理。故选A。 (4) 选B。 (5) 选D。
第四章 语义分析和中间代码生成
4.6 设某语言的while语句的语法形式为
S→ while E do S(1) 其语义解释如图4-2所示。 (1) 写出适合语法制导翻译的产生式; (2) 写出每个产生式对应的语义动作。 【解答】 本题的语义解释图已经给出了翻译后的中间 代码结构。在语法制导翻译过程中,当扫描到while时,应 记住E的代码地址;当扫描到do时,应对E的“真出口”进 行回填,使之转到S(1)代码的入口处;当扫描到S(1)时,除 了应将E的入口地址传给S(1).chain之外,还要形成一个转向 E入口处的无条件转移的四元式,并且将E.fc继续传下去。
第四章 语义分析和中间代码生成
(6) 选B。
(7) 选C。 (8) 参见第一章1.3节,中间代码生成时所依据的是语义 规则。故选C。 (9) 四元式表示法的优点是既便于优化处理又便于表的 更动。故选C。 (10) 句子b(((aa)a)a)b对应的语法树见图4-1,采用自底向 上归约得到的输出序列为:34242421。故选B。
第四章 语义分析和中间代码生成
图4-1 句子b(((aa)a)a)b对应的语法树
第四章 语义分析和中间代码生成
4.2 何谓“语法制导翻译”?试给出用语法制导翻译生
成中间代码的要点,并用一简例予以说明。 【解答】 语法制导翻译(SDTS)直观上说就是为每个产 生式配上一个翻译子程序(称语义动作或语义子程序),并且 在语法分析的同时执行这些子程序。也即在语法分析过程中, 当一个产生式获得匹配(对于自上而下分析)或用于归约(对于 自下而上分析)时,此产生式相应的语义子程序进入工作, 完成既定的翻译任务。 用语法制导翻译(SDTS)生成中间代码的要点如下: (1) 按语法成分的实际处理顺序生成,即按语义要求生 成中间代码。
第四章 语义分析和中间代码生成
102 (j<,B,D,104) 103 (j,_,_,113) 104 (j=,A,1,106) 105 (j,_,_,108) 106 (+, C, 1, C) 107 (j,_,_,112) 108 (j≤,A,D,110) 109 (j,_,_,112) 110 (+, A, 2, A) 111 (j,_,_,108) 112 (j,_,_,100) 113 //E1 为 T //E1 为 F //E2 为 T //E2 为 F //C:=C+1 //跳过 else 后的语句 //E3 为 T //E3 为 F //A:=A+2 //转回内层 while 语句开始处 //转回外层 while 语句开始处
(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的中间代码,最
第四章 语义分析和中间代码生成
【解答】 计算 S.val 的文法 G ′ [S]及语义动作如下: G′ [S]: 产生式 S′ →S S→L1·L2 S→L L→L1B L→B B→1 B→0 语义动作 {print(S.val)} {S.val:=L1.val + L2.val/2L2.length} { S.val:=L.val } {L.val:=L 1.val*2 + B.val L.length:=L1.length +1} {L.val:=B.val L.length:=2} {B.val:=1} {B.val:=0}
第四章 语义分析和中间代码生成
4.4 下面的文法生成变量的类型说明: D→id L L →,id L | :T T →integer | real 试构造一个翻译方案,仅使用综合属性,把每个标识符的类型 填入符号表中(对所用到的过程,仅说明功能即可,不必具体写 出)。
第四章 语义分析和中间代码生成
第四章 语义分析和中间代码生成
按照该文法,语法制导翻译程序不需要语义变量队列 queue,但需要一个语义变量栈 STACK,用来实现按反序记录 每个实在参数的地址。 翻译过程(函数)调用语句的产生式及语义 子程序如下: (1) arglist→E 仅包含一项 E.place} (2) arglist→arglist ,E 栈, arglist. STACK=arglist .STACK} (3) S→call i (arglist)
(2) 0 A (1)
第四章 语义分析和中间代码生成
4.8 按照三种基本控制结构的文法将下面的语句翻译成四 元式序列: while (A<C∧B<D) { if (A≥1) C=C+1; else while (A≤D) A=A+2; } 【解答】 该语句的四元式序列如下(其中 E1、E2 和 E3 分 别对应 A<C∧B<D、A≥1 和 A≤D,并且关系运算符优先级 高): 100 (j<,A,C,102) 101 (j,_,_,113) //E1 为 F
(1)
第四章 语义分析和中间代码生成
4.7 改写布尔表达式的语义子程序, 使得 i rop i 不按通常方 式翻译为下面的相继两个四元式: (jrop, i (1), i(2), 0) (j ,_ ,_ , 0 ) 而是翻译成如下的一个四元式: (jnrop, i (1), i(2), 0) 使得当 i(1) rop i (2)为假时发生转移,而为真时并不发生转移(即顺 序执行下一个四元式),从而产生效率较高的四元式代码。
(5) 后缀式________对应的中缀表达式是a-(-b)*c (注:
C. ab-c@*
D.ab@c*-
第四章 语义分析和中间代码生成
(6) 后缀式ab+cd+/ 可用中缀表达式________来表示。
A.a+b/c+d C.a+b/(c+d) A.ab*c+ A.语法规则 C.语义规则 B.(a+b)/(c+d) D.a+b+c/d B.abc*+ C.ab+c* D.abc+*
(1) (1)
{ 建立一个 arglist.STACK 栈, 它 { 将 E.place 压入 arglist . STACK
(1)
{while (arglist.STACK!=null do) { 将 arglist.STACK 栈
顶项弹出并送入 p 单元之中; emit (par,_ ,_ ,p); }; emit (call,_ ,_ , entry (i));}
(1) (2)
第四章 语义分析和中间代码生成
【解答】 按要求改造描述布尔表达式的语义子程序如下: (1) E→i {E.tc=null;E.fc=nxq;emit(jez,entry(i),_ ,0);} (2) E → i (1) rop
(1) (2)
i(2)
{E.tc=null;E.fc=nxq;emit(jnrop,entry(i ),entry(i ),0);} // nrop 表示关系运 算符与 rop 相反 (3) E→(E(1)) (4) E→┐E(1) (5) E →E ∧ A (2) (6) E→E E (7) E0→E(1)∨ (8) E→E E
(7) 表达式(a+b)*c的后缀表达式为________。 (8) 中间代码生成时所依据的是________。 B.词法规则 D.等价变换规则
第四章 语义分析和中间代码生成
(9) 四元式表示法的优点为________。
A.不便于优化处理但便于表的更动 B.不便于优化处理但节省存储空间 C.便于优化处理也便于表的更动 D.便于表的更动也节省存储空间 (10) 有一语法制导翻译如下所示: S→bAb A→(B A→a B→Aa) {print''1''} {print''2''} {print''3''} {print''4''}
第四章 语义分析和中间代码生成
4.5 写出翻译过程调用语句的语义子程序。在所生成的
四元式序列中,要求在转子指令之前的参数四元式par按反 序出现(与实现参数的顺序相反)。此时,在翻译过程调用语 句时,是否需要语义变量queue(队列)? 【解答】 为使过程(函数)调用语句的语义子程序产生 的参数四元式par按反序方式出现,过程(函数)调用语句的文 法为 S→call i(arglist) arglist→E arglist→arglist(1),E
因此,应把S→while E do S(1) 改写为如下的三个产生式:
第四章 语义分析和中间代码生成
图4-2 习题4.6的语句结构图
第四章 语义分析和中间代码生成
W→while A→W E do S→A S 每个产生式对应的语义子程序如下: W→while { W.quad=nxq;} A→W E do { backpatch(E.tc,nxq); A.chain=E.fc; A.quad=W.quad;} S→A S(1) { backpatch(S(1).chain,A.quad); emit(j,_,_,A.quad); S.chain=A.chain;}
后才产生“-”运算的中间代码,这种顺序不能颠倒。
第四章 语义分析和中间代码生成
4.3 令S.val为文法G[S]生成的二进制数的值,例如对输
入串101.101,则S.val=5.625。按照语法制导翻译方法的思 想,给出计算S.val的相应的语义规则,G(S)如下: G[S]:S→L.L | L L→LB | B B→0 | 1
0 (2) A (1)
{E.tc=E(1).tc; E.fc=E(1).fc;} {E.fc=nxq;emit(j,_ ,_ ,0);backpatch(E(1).fc,nxq);} {E .fc=E .fc;} (2) A (2) {E.tc=E .tc;E.fc=merg(E .fc,E .fc);} {E 0.tc=nxq;emit(j,_ ,_ ,0);backpatch(E(1).fc,nxq);} {E.fc=E .fc;backpatch(E .tc,nxq);}
第四章 语义分析和中间代码生成
第四章 语义分析和中间代码生成
第四章 语义分析和中间代码生成
4.1 完成下列选择题:
(1) 中间代码的优点是 A.节省存储空间 C.编译结构在逻辑上更为简单明确 D.节省内存且编译时间短 (2) 四元式之间的联系是通过 A.指示器 C.符号表 实现的。 B.临时变量 D.程序变量 。 B.编译时间短
Leabharlann Baidu
第四章 语义分析和中间代码生成
(3) 间接三元式表示法的优点为
。
A.采用间接码表,便于优化处理 B.节省存储空间,不便于表的修改 C.便于优化处理,节省存储空间 D.节省存储空间,不便于优化处理 (4) 表达式(┐A∨B)∧(C∨D)的逆波兰表示为 A.┐AB∨∧CD∨ C.AB∨┐CD∨∧ @表示求负运算)。 A.a-b@c* B.ab@-c* 。 B.A┐B∨CD∨∧ D.A┐B∨∧CD∨
第四章 语义分析和中间代码生成
若输入序列为b(((aa)a)a)b,且采用自底向上的分析方法,则
输出序列为 。 B.34242421 D.34442212 A.32224441 C.12424243 【解答】 (1) 中间代码的优点是使编译结构在逻辑上更为简单明 确,特别是使目标代码的优化比较容易实现。故选C。 (2) 四元式之间的联系是通过临时变量实现的。故选B。 (3) 间接三元式采用间接码表,便于优化处理。故选A。 (4) 选B。 (5) 选D。
第四章 语义分析和中间代码生成
4.6 设某语言的while语句的语法形式为
S→ while E do S(1) 其语义解释如图4-2所示。 (1) 写出适合语法制导翻译的产生式; (2) 写出每个产生式对应的语义动作。 【解答】 本题的语义解释图已经给出了翻译后的中间 代码结构。在语法制导翻译过程中,当扫描到while时,应 记住E的代码地址;当扫描到do时,应对E的“真出口”进 行回填,使之转到S(1)代码的入口处;当扫描到S(1)时,除 了应将E的入口地址传给S(1).chain之外,还要形成一个转向 E入口处的无条件转移的四元式,并且将E.fc继续传下去。
第四章 语义分析和中间代码生成
(6) 选B。
(7) 选C。 (8) 参见第一章1.3节,中间代码生成时所依据的是语义 规则。故选C。 (9) 四元式表示法的优点是既便于优化处理又便于表的 更动。故选C。 (10) 句子b(((aa)a)a)b对应的语法树见图4-1,采用自底向 上归约得到的输出序列为:34242421。故选B。
第四章 语义分析和中间代码生成
图4-1 句子b(((aa)a)a)b对应的语法树
第四章 语义分析和中间代码生成
4.2 何谓“语法制导翻译”?试给出用语法制导翻译生
成中间代码的要点,并用一简例予以说明。 【解答】 语法制导翻译(SDTS)直观上说就是为每个产 生式配上一个翻译子程序(称语义动作或语义子程序),并且 在语法分析的同时执行这些子程序。也即在语法分析过程中, 当一个产生式获得匹配(对于自上而下分析)或用于归约(对于 自下而上分析)时,此产生式相应的语义子程序进入工作, 完成既定的翻译任务。 用语法制导翻译(SDTS)生成中间代码的要点如下: (1) 按语法成分的实际处理顺序生成,即按语义要求生 成中间代码。