资源描述:
《条件语句的翻译分析程序设计》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、条件语句的翻译分析程序设计条件语句的翻译分析程序设计 --LR方法、输出四元式1.问题描述对条件语句:if〈布尔表达式〉〈赋值语句〉else〈赋值语句〉,进行词法,语法分析,并根据语法制导翻译方法将条件语句翻译成四元式中间代码形式,最后输出翻译后的四元式代码。2.文法及属性文法描述2.1if-else语句的LR文法:采用LR方法,因此可以得到如下文法:G[S]:S→if(B)SelseS S→if(B)S S→i=E B→B&&BB→B
2、
3、BB→!BB→ErelopE E→E+E E→E
4、*E E→-E E→(E) E→i 其中relop是终结符号,代表关系运算符<,<=,>,>=,!=等。 通过一遍扫描来产生布尔表达式和控制语句的代码的主要问题在于,当生成某些转移语句时还不知道该语句将要转移到的目标是什么。为了解决这个问题,可以在生成形式分之的跳转指令时暂时不确定跳转目标,而建立一个链表,把转向这个目标的跳转指令的标号键入这个链表。一旦目标确定后再把它填入有关的跳转指令中,因此将上述文法扩展为: P→SM S→if(B)M1S1NelseM2S2
5、 S→if(B)MS1 S→i=E B→B1&&MB2 B→B1
6、
7、MB2 B→!B1 B→E1relopE2 E→E1+E2 E→E1*E2 E→-E1 E→(E1) E→i M→¢;代表的是空 N→¢;代表的是空2.2if-else语句的LR属性文法: 由以上扩展的文法可得到如下的属性文法:P→SM {if(S.nextlist!=¢)thenbackpatch(S.nextlist,M.pos); }S→if(B)M1S1NelseM2S2{backpatch(B.t
8、ruelist,M1.pos);backpatch(B.falselist,M2.pos);S.nextlist=merge(S1.nextlist,S2.nextlist);S.nextlist=merge(S.nextlist,N.nextlist);}S→if(B)MS1{backpatch(B.truelist,M.pos);S.nextlist=merge(B.falselist,S1.nextlist);}S→i=E {p=lookup(i.name); if(p!=Nullthengen
9、quad("=",E.place,"",p.place); } B→B1&&MB2 {backpatch(B1.truelist,M1.pos); B.truelist=B2.truelist; B.falselist=merge(B1.falselist,B2.falselist); } B→B1
10、
11、MB2{backpatch(B1.falselist,M1.pos);B.truelist=B2.truelist; B.falselist=merge(B1.trueli
12、st,B2.truelist); B.falselist=B2.falselist; }B→!B1 {B.truelist=B1.falselist;B.falselist=B2.falselist; } B→E1relopE2 {B.truelist=makelist(nexpos+1); B.false=makelist(nextpos+2); genquad(relop,E1.place,E2.place,"_"); genquad("J","","","_");} E→E1+
13、E2 {e=newtemp; e.place=E1.place+E2.place; genquad("+",E1.place,E2.place,e.place);} E→E1*E2 {e=newtemp; e.place=E1.place*E2.place;genquad("*",E1.place,E2.place,e.place);} E→-E1{e=newtemp;e.place=-E.place; genquad("uminus",E.place,"",e.place);} E→
14、(E1) {E.place=E1.place;} E→i {E.place=i.value; } M→¢{M.pos=nextpos+1;} N→¢ {N.next=makelist(nextpos+1); genquad("J","","","_"); } 其中relop可为任意的关系运算符,i可以为标识符,也可以为常数。M以及N是为了便于分析生成四元式而设的。3.语