编译原理作业集-第七章(3)

2019-08-03 10:59

编译原理作业集-第七章 语义分析和中间代码产生

}

翻译为:(1)一棵语法树, (2)后缀式, (3)三地址代码。

6.答案:(1)

(2) 后缀式为: i 10 <= a i [] 0 = while

从理论上可以说 while ( i <= 10 ) a[i] = 0; 的后缀式如上面表示。但若这样表示,在执行while操作时,赋值语句已经执行,这显然与语义不符,因此改为:

i 10 <= <下一个语句开始地址> BM a i [] 0 = <本语句始址>BRL

其中BM操作为当表达式为假时转向<下一个语句开始地址>,BRL是一个一目运算,无条件转向<本语句始址>。 (3) 三地址代码序列为: 100 if i <= 10 goto 102 101 goto 106 102 t1 := 4 * i 103 t2 := a 104 t2[t1] := 0 105 goto 100 106

7. 已知布尔表达式翻译成三地址代码的翻译模式如下: E→E1 or E2 { E.place:=newtemp; emit(E.place ':=' E1.place 'or' E2.place) } E→E1 and E2 { E.place:=newtemp; emit(E.place ':=' E1.place 'and' E2.place) } E→not E1 { E.place:=newtemp; emit(E.place ':=' 'not' E1.place) } E→(E1) { E.place:= E1.place } E→id1 relop id2 { E.place:=newtemp; emit('if' id1.place relop.op id2.place 'goto' nextstat+3); emit(E.place ':=' '0'); emit('goto' nextstat+2); emit(E.place ':=' '1') } E→id1 { E.place:=id.place }

试编写一个递归下降程序,用来该属性文法。

西安理工大学计算机科学与工程学院,张发存编写 2013-5-20,9:37:18

- 11 - - -

编译原理作业集-第七章 语义分析和中间代码产生

7. 答案:

首先消除该翻译模式的左递归:

(注:'{','}'为元语言符号。) 递归预测翻译程序如下:

TYPE link = 表类型; PROCEDURE E ; VAR E.truelist, E.falselist, T.truelist, T.falselist: link; BEGIN { E.truelist, E,falselist } := T; WHILE ( lookahead == 'or ' ) DO BEGIN match(or); M.quad := nextquad; { T.truelist, T.falselist } := T; backpatch(E.falselist, M.quad); E.truelist := merge(E.truelist, T.truelist); E.falselsit := T.falselist END; return({E.truelist, E.falselist}) END;

PROCEDURE T; VAR T.truelist, T.falselist, F.truelsit, F.falselist: link;

西安理工大学计算机科学与工程学院,张发存编写 2013-5-20,9:37:18

- 12 - - -

编译原理作业集-第七章 语义分析和中间代码产生

BEGIN { T.truelist, T,falselist } := F; WHILE ( lookahead == 'and ' ) DO BEGIN match(and); M.quad := nextquad; { F.truelist, F.falselist } := F; backpatch(T.truelist, F.truelist); T.truelist := F.truelist; T.falselist := merge(T.falselist, F.falselist) END; return({T.truelist, T.falselist}) END;

PROCEDURE F; VAR F.truelist, F.falselist, E.truelsit, E.falselist: link; BEGIN CASE ( lookahead ) OF 'not' :BEGIN match(not); { E.truelist, E.falselist } := F; F.truelist := E.falselist; F.falselist := E.truelist END; '( ' : BEGIN match((); { E.truelist, E.falselist ) := E; match()); F.truelist := E.truelist; F.falselist := E.falselist END; 'id' : BEGIN match(id); match(relop); match(id); F.truelist := makelist(nextquad); F.falselist := makelist(nextquad+1); emit('if' id1.place relop id2.place 'goto-'); emit('goto-') END; 'true': BEGIN match(true); F.truelist := makelist(nextquad);

西安理工大学计算机科学与工程学院,张发存编写 2013-5-20,9:37:18

- 13 - - -

编译原理作业集-第七章 语义分析和中间代码产生

F.falselist := null; emit('goto-') END; 'false':BEGIN match(false); F.truelist := makelist(nextquad); F.falselist := null; emit('goto-') END otherwise : error END of CASE return({F.truelist, F.falselist}) END;

8. 试编写翻译模式,用来实现do-while语句的回填算法。 8.答案:

do-while语句的三地址代码结构如下:

从do-while语句的三地址代码结构可以知道,开始,要记录下L.code的开始地址,以填写E.truelist。 生成E.code之前,要记录下E.code的开始地址,用它填写L.nextlist。为此,在规则相应处添加标记非终结符,以完成相应的语义动作。翻译模式如下:

9. Pascal语言中,语句

for v:=initial to final do stmt

西安理工大学计算机科学与工程学院,张发存编写 2013-5-20,9:37:18

- 14 - - -

编译原理作业集-第七章 语义分析和中间代码产生

与下列代码序列有相同含义

begin t1:=initial; t2:=final; if t1<=t2 then begin v:=t1; stmt while v<>t2 do begin v:=succ(v); stmt end end end

(1)试考虑下述Pascal程序

program forloop(input, output); var i,initial,final: integer; begin read(initial, final); for i:= initial to final do write(i) end

对于initial=MAXINT-5和final= MAXINT,问此程序将做些什么?其中MAXINT为目标机器允许的最大整数。

(2)试构造一个翻译pascal的for语句为三地址代码的语法制导定义。 9.

(1)显示如下六个整数: MAXINT -5 MAXINT -4 MAXINT -3 MAXINT -2 MAXINT -1 MAXINT

(2)为简单起见,for语句的三地址代码如下:

t1 := initial t2 := final

if t1 > t2 goto S.next v := t1 stmt.code S.begin:

if v > t2 goto S.next v := succ(v) stmt.code goto S.begin

语法制导定义如下:

西安理工大学计算机科学与工程学院,张发存编写 2013-5-20,9:37:18

- 15 - - -


编译原理作业集-第七章(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:避税 节税 逃税问题的研究

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: