- 1、本文档共48页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1;第七章 语义分析和中间代码产生;布尔表达式的翻译;P218-6. 按7.4.2节的办法,写出布尔式A or (B and not (C or D))的四元式序列。;P218-6. 按7.4.2节的办法,写出布尔式A or (B and not (C or D))的四元式序列。;常用语句的翻译;P218-7. 用7.5.1节的办法,把下面的语句翻译成四元式序列: while A < C and B < D do if A=1 then C:=C+1 else while A ? D do A:=A+2;;P218-7. 用7.5.1节的办法,把下面的语句翻译成四元式序列: while A < C and B < D do if A=1 then C:=C+1 else while A ? D do A:=A+2;;12. Pascal语言中for语句的一般形式为 for v:=initial to final do S其意义如下:begin t1:=initial; t2:=final; if t1 ? t2 then begin v:=t1; S; while v ? t2 do begin v:=succ(v); S; end endend;;构造翻译模式 ;F→ for id:=E1 to E2 do
{
INITIAL=NEWTEMP;
emit(‘:=,’ E1.PLACE ’, -,’ INITIAL);
FINAL=NEWTEMP;
emit(‘:=,’ E2.PLACE ’, -,’ FINAL);
p:= nextquad+2;
emit(‘j?,’ INITIAL ‘,’ FINAL ’,’ p);
F.nextlist:=makelist(nextquad);
emit(‘j,-,-,-’);
F.place:=lookup(id.name);
if F.place?nil then
emit( ‘:=’, F.place,’-’, INITIAL);
F.quad:=nextquad;
F.final:=FINAL;
} ;S→ F S1
{
backpatch(S1.nextlist, nextquad)
p:=nextquad+2;
emit(‘j?,’ F.place‘,’ F.final ’,’ p );
S.nextlist := merge(F.nextlist, makelist(nextquad));
emit(‘j,-,-,-’);
emit(‘succ,’ F.place ’, -, ’ F.place);
emit(‘j,-,-,’ F.quad);
}
;14;构造翻译模式 ;构造翻译模式 ;F→ for I:=E1 to E2
{
F.falselist:= makelist(nextquad);
emit(‘j>,’ E1.place ‘,’ E2.place ‘,0’);
emit(I.Place ‘:=’E1.place);
F.truelist := makelist(nextquad);
emit(‘j,-,-,0’);
F.place := I.place;
F.end := E2.place;
}
S→ F do M S1
{
backpatch(S1.nextlist, nextquad);
backpatch(F.truelist, M.quad);
emit(F.place ‘:=’F.place ‘+’1);
emit(‘j<=,’ F.place ‘,’ F.end ‘,’ M.quad);
S.nextlist := F.falselist;
};S→ F do M S1
{
backpatch(S1.nextlist,nextquad);
backpatch(F.truelist,M.quad);
emit(F.place ‘:=’F.place ‘+’1);
emit(‘j,’F.place ‘,’F.end ‘,’M.quad);
S.nextlist := F.falselist;
}
F→ for I:=E1 to E2
{
F.falselist:= makelist(nextquad);
emit(‘j>,’E1.place ‘,’E2.place ‘,0’);
emit(I.Place ‘:=’E1.place);
F.truelist := makelist(nextquad);
文档评论(0)