资源预览内容
第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
第9页 / 共13页
第10页 / 共13页
亲,该文档总共13页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
设程序结构定义如下: P S S if E then S S if E then S else S S while E do S S begin L end S A L L;S L S 布尔表达式 E 及赋值语句 A定义见书上,为能及时地回填有关四元式串的转移地址,改写文法如下: P S C,if E then,S CS1,Tp CSelse,S TP S2,W while,Wd W E do,S Wd S3,S begin L end,S A,LS L;,L LSS1,自底向上语法制导翻译方案实现过程分析(关于控制结构的翻译),翻译中使用回填-拉链技术 翻译 while(ad) then x=y+z,步骤1: 移进while , 并按如下产生式归约 W whileW.codebegin=nextstat; 四元式表内容如下:,nextstat 100,W.codebegin,句型变为 W (ad) then x=y+z,步骤2: 对于句型 W (ad) then x=y+z 移进(ab) 并按如下产生式归约 E i1 relop i2 E.true= nextstat; E.false= nextstat+1; E.codebegin= nextstat; gen( if ab goto _ ); gen(goto _ ); E (E1) E.true= E1 .true ; E.false= E1 . false ; E.codebegin= E1 . codebegin ; 四元式表内容如下:,E.true 100 if ab goto _ W.codebegin,E.false 101 goto _,句型变为 W E do if (cd) then x=y+z,步骤 3: 对于句型 W E do if (cd) then x=y+z 移进do 并按如下产生式归约 W d W E do backpatch(E.true, nextstat); W d .chain=E.false; W d . codebegin= W. codebegin; 四元式表内容如下:,100 if ab goto 102 W d .codebegin,W d .chain 101 goto _,nextstat,102,句型变为 W d if (cd) then x=y+z,步骤4: 对于句型 W d if (cd) then x=y+z 移进if (cd), 并按如下产生式归约 E i1 relop i2 E.true= nextstat; E.false= nextstat+1; E.codebegin= nextstat; gen( if ab goto _ ); gen(goto _ ); E (E1) E.true= E1 .true ; E.false= E1 . false ; E.codebegin= E1 . codebegin ; 四元式表内容:,100 if ab goto 102 W d .codebegin,W d .chain 101 goto _,nextstat,102,if cd goto _,103 goto _,104,E.true,E.false,句型变为 W d if E then x=y+z,步骤5: 对于句型 W d if E then x=y+z 按如下产生式归约 C if E then backpatch(E.true,nextstat); C.chain=E.false; 四元式表内容:,100 if ab goto 102 W d .codebegin,W d .chain 101 goto _,nextstat,102,if cd goto 104,103 goto _,104,C.chain,句型变为 W d C x=y+z,步骤6: 对于句型 W d C x=y+z 移进x=y+z ,按如下产生式归约 B i p=lookup(i.name);if (pnil) E.place=p else error B B1+B2B.place =newtemp;gen(B.place= B1.place+ B2 .place; A i=B p=lookup(i.name);if (pnil) gen(p=E.place) else error 四元式表内容:,100 if ab goto 102 W d .codebegin,W d .chain 101 goto _,nextstat,102,if cd goto 104,103 goto _,104 t=y+z,C.chain,句型变为: W d C A,105 x=t,106,步骤7: 对于句型 W d C A , 按如下产生式归约 S A S.chain=0 S CS1 S.chain =merge(C.chain, S1 .chain); / 可能 S1 if a then x=1elsex=2; 四元式表内容:,100 if ab goto 102 W d .codebegin,W d .chain 101 goto _,nextstat,102,if cd goto 104,103 goto _,104 t=y+z,S.chain,句型变为: W d S,105 x=t,106,步骤8: 对于句型 W d S , 按如下产生式归约 S W d S1 backpatch(S1.chain, W d .codebegin); gen(goto W d .codebegin); S.chain= W d . chain 四元式表内容:,100 if ab goto 102 W d .codebegin,S .chain 101 goto _,nextstat,102,if cd goto 104,103 goto 100,104 t=y+z,句型变为: S,105 x=t,106 goto 100,107,步骤9: 对于句型 S , 按如下产生式归约(假设忽略说明语句) P S backpatch(S.chain, nextstat); gen(return /返回主函数 四元式表内容:,100 if ab goto 102,101 goto 107,nextstat,102,if cd goto 104,103 goto 100,104 t=y+z,105 x=t,106 goto 100,107 return,108,递归下降语法制导翻译方案中实现控制结构的翻译: 翻译思路: 布尔表达式求值, 并设置标号避免回填, if (E) getlabel gen(JZ, E.place,_,label1) S1 getlabel gen(JP,_,_,label2) setlabel(label1:) else S1 setlabel(label2:) while getlabel setlabel(label1:) ( E ) getlabel gen(JZ, E.place,_,label2) do S gen(JP,_,_,label1) setlabel(label2:),label1,label2,label1,label2, for (E1 ; getlabel setlabel(label1:) E2 getlabel getlabel gen(JZ, E2 .place,_,label2) gen(JP,_,_,label3) ; getlabel setlabel(label4:) E3 gen(JP,_,_,label1) ) setlabel(label3:) S gen(JP,_,_,label4) setlabel(label2:) read i look gen(IN,标准输入设备,_,i.place),label1,label2,label3,label4,write (E) gen(out, E.place, _, 标准输出设备),name,name place,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号