预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共43页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

编译原理与技术中间代码生成布尔表达式的翻译布尔表达式的翻译布尔表达式的翻译布尔表达式的翻译id1relopid2(关系表达式)布尔表达式的翻译id(布尔变量)e.g.16a<borc=dandnote>f的三地址码: (100) ifa<bgoto103 (101) t1:=0 (102) goto104 (103) t1:=1 //以上为a<b的翻译 (104) ifc=dgoto107 (105) t2:=0 (106) goto108 (107) t2:=1 //以上为c=d的翻译e.g.16a<borc=dandnote>f的三地址码: (108) ife>fgoto111 (109) t3:=0 (110) goto112 (111) t3:=1 //以上为e>f的翻译 (112) t4:=nott3 //以上为note>f的翻译 (113) t5:=t2andt4 //以上为c=dandnote>f的翻译 (115) t6:=t1ort5 //以上为a<borc=dandnote>f的翻译 a<borc=dandnote>f布尔表达式的翻译短路计算短路计算短路计算回填技术 -相关符号属性及语义函数: E.truelist:布尔表达式代码中所有转向真出口的代码语句链; E.falselist:所有转向假出口的代码语句链; backpatch(code-list,target-code) //将目标地址target-code填回code-list中每条语句 merge(code-list1,code-list2) //合并链code-list1和code-list2(它们包含的语句转移目标相同) makelist(code-No),makelist()-建立含语句编号为code-No的链或空链 M {M.code:=nextcode} //获取下一三地址代码(语句)的编号(作为转移目标来回填)短路计算及回填的翻译方案(3)EnotE1{ E.truelist:=E1.falselist; E.falselist:=E1.truelist;} (4)E(E1){ E.truelist:=E1.truelist; E.falselist:=E1.falselist;} (5)Eid1relopid2{ E.truelist:=makelist(nextcode); emit(“if”id1.placerelop.opid2.place“goto”-); E.falselist:=makelist(nextcode); emit(“goto”-);}(6)Etrue{ E.truelist:=makelist(nextcode); emit(“goto”-); E.falselist:=makelist();} (7)Efalse{ E.falselist:=makelist(nextcode); emit(“goto”-); E.truelist:=makelist();}控制流语句的翻译条件语句的翻译(1)条件语句的翻译(1)条件语句的翻译(2)条件语句的翻译(2)循环语句的翻译(1)循环语句的翻译(1)循环语句的翻译(2)循环语句的翻译(2)循环语句的翻译(3)文法G4中其它语句的翻译CASE/SWITCH语句的翻译(0)E.code t:gototest(待回填)CASE/SWITCH语句的翻译(1)CASE/SWITCH语句的翻译(2)e.g.17控制流语句的翻译e.g.17控制流语句的翻译e.g.17控制流语句的翻译e.g.17控制流语句的翻译e.g.17控制流语句的翻译e.g.17控制流语句的翻译(100)ifa<bgoto106(106)ifa>cgoto108 (101)goto102 (107)goto112 (102)ifc<dgoto104 (108)c:=c+1 (103)goto111 (109)goto106 (104)ife<fgoto106 (110)goto112 (105)goto111 (111)d:=d+1 (112)e:=e+de.g.18Linux下C语言控制流语句的翻译