xt07答案.docx
- 文档编号:29597601
- 上传时间:2023-07-25
- 格式:DOCX
- 页数:12
- 大小:67.39KB
xt07答案.docx
《xt07答案.docx》由会员分享,可在线阅读,更多相关《xt07答案.docx(12页珍藏版)》请在冰豆网上搜索。
xt07答案
练习7.1
解答:
a)
b)后缀式:
abc+uminus*
c)三地址代码序列为:
t1:
=b+c
t2:
=-t1
t3:
=a*t2
练习7.2
解答:
a):
四元式序列为:
op
arg1
arg2
result
(1)
+
a
b
t1
(2)
+
c
d
t2
(3)
*
t1
t2
t3
(4)
uminus
t3
t4
(5)
+
a
b
t5
(6)
+
t5
c
t6
(7)
+
t4
t6
t7
b):
三元式序列为:
op
arg1
arg2
(1)
+
a
b
(2)
+
c
d
(3)
*
(1)
(2)
(4)
uminus
(3)
(5)
+
a
b
(6)
+
(5)
c
(7)
+
(4)
(6)
c):
间接三元式表示:
statement
op
arg1
arg2
(1)
(11)
(11)
+
a
b
(2)
(12)
(12)
+
c
d
(3)
(13)
(13)
*
(11)
(12)
(4)
(14)
(14)
uminus
13
(5)
(11)
(15)
+
(11)
c
(6)
(15)
(16)
+
(14)
(15)
(7)
(16)
练习7.3
解答:
a)
b)后缀式为:
i10<= ai[]0=while
从理论上可以说while(i<=10)a[i]=0;的后缀式如上面表示。
但若这样表示,在执行while操作时,赋值语句已经执行,这显然与语义不符,因此改为:
i10<=<下一个语句开始地址>BMai[]0=<本语句始址>BRL
其中BM操作为当表达式为假时转向<下一个语句开始地址>,BRL是一个一目运算,无条件转向<本语句始址>。
c)三地址代码序列为:
100 ifi<=10goto102
101 goto106
102 t1:
=4*i
103 t2:
=a
104 t2[t1]:
=0
105 goto100
106
练习7.4
解答:
练习7.5
解答:
首先消除图7.14中翻译模式的左递归:
(注:
'{','}'为元语言符号。
)
递归预测翻译程序如下:
TYPE
link=表类型;
PROCEDUREE;
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;
PROCEDURET;
VAR
T.truelist,T.falselist,F.truelsit,F.falselist:
link;
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;
PROCEDUREF;
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.placerelopid2.place'goto-');
emit('goto-')
END;
'true':
BEGIN
match(true);
F.truelist:
=makelist(nextquad);
F.falselist:
=null;
emit('goto-')
END;
'false':
BEGIN
match(false);
F.truelist:
=makelist(nextquad);
F.falselist:
=null;
emit('goto-')
END
otherwise:
error
ENDofCASE
return({F.truelist,F.falselist})
END;
练习7.6
解答:
首先消除控制语句的翻译模式中的左递归。
仅涉及L的产生式。
因此,关于L的翻译模式改写成:
L->S {L.nextlist:
=S.nextlist}
'{';MS1 {backpatch(L.nextlist,M.quad);
L.nextlist:
=S1.nextlist;}
'}'
递归预测翻译程序如下:
PROCEDURES;
VAR
S.nextlist,S1.nextlist,S2.nextlist,
E.truelist,E.falselist,N.nextlist:
link;
M.quad:
integer;
BEGIN
CASE(lookahead)OF
'if' :
BEGIN
match(if);
{E.truelist,E.falselist}:
=E;
M.quad:
=nextquad;
backpatch(E.truelist,M.quad);
S1.nextlist:
=S;
if(lookahead=='else')
THENBEGIN
N.nextlist:
=N;
match(else);
M.quad:
=nextquad;
S2.nextlist:
=S;
backpatch(E.falselist,M.quad);
S.nextlist:
=merge(S1.nextlsit,N.nextlist,S2.nextlist)
END
ELSE S.nextlist:
=merge(E.falselist,S1.nextlist);
END;
'while':
BEGIN
match(while);
M.quad:
=nextquad;
{E.truelist,E.falselist):
=E;
match(do);
backpatch(E.truelist,nextquad);
S1.nextlist:
=S;
backpatch(S1.nextlist,M.quad);
emit('gogo'M.quad);
S.nextlist:
=E.falselist
END;
'begin' :
BEGIN
match(begin);
S.nextlist:
=L;
match(end)
END;
other:
BEGIN
A;
S.nextlist:
=makelist()
END;
ENDofCASE;
return(S.nextlist)
END;
PROCEDUREN;
VAR N.nextlist:
link;
BEGIN
N.nextlist:
=makelist(nextquad);
emit('goto-');
return(N.nextlist)
END;
PROCEDUREL;
VAR
L.nextlist,S.nextlist:
link;
M.quad:
integer;
BEGIN
L.nextlist:
=S;
WHILE(lookahead==';')DO
BEGIN
match(;);
backpatch(L.nextlist,nextquad);
S.nextlist:
=S;
L.nextlist:
=S.nextlist
END;
return(L.nextlist)
END;
练习7.7
解答:
do-while语句的三地址代码结构如下:
从do-while语句的三地址代码结构可以知道,开始,要记录下L.code的开始地址,以填写E.truelist。
生成E.code之前,要记录下E.code的开始地址,用它填写L.nextlist。
为此,在规则相应处添加标记非终结符,以完成相应的语义动作。
翻译模式如下:
练习7.8
解答:
对于C语言的数组,每维的下界约定为0。
例如,对A[10,10]来说,A[0,0]是第一元素,A[i,j]的相对地址为:
base+(i*n2+j)*w
三地址序列如下:
注:
A,B,C,D分别表示数组A,B,C,D的基地址。
练习7.9
解答:
(a)显示如下六个整数:
MAXINT-5
MAXINT-4
MAXINT-3
MAXINT-2
MAXINT-1
MAXINT
(b)为简单起见,for语句的三地址代码如下:
t1:
=initial
t2:
=final
ift1>t2gotoS.next
v:
=t1
stmt.code
S.begin:
ifv>t2gotoS.next
v:
=succ(v)
stmt.code
gotoS.begin
语法制导定义如下:
S->forv:
=initialtofinaldostmt
S.temp1:
=newtemp
S.temp2:
=newtemp
S.begin:
=newlabel
stmt.next:
=S.begin
S.code:
=gen(S.temp1':
='initial)||
gen(S.temp2':
='final)||
gen('if'S.temp1'>'S.temp2'goto'S.next)||
gen(v.place':
='S.temp1)||
stmt.code||
gen(s.begin':
if'v.place'>'S.temp2'goto'S.next)||
gen(v.place':
=''succ('v.place')')||
stmt.code||
gen('goto'S.begin)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- xt07 答案
![提示](https://static.bdocx.com/images/bang_tan.gif)