语义分析和中间代码产生_第1页
语义分析和中间代码产生_第2页
语义分析和中间代码产生_第3页
语义分析和中间代码产生_第4页
语义分析和中间代码产生_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

语义分析和中间代码产生第一页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月20232语义分析的任务:根据语法成分的结构,分析其含义,并用一种内部形式(中间代码)或直接用目标语言表示出来。具体:静态语义检查和翻译包括:类型检查(操作符是否相容,例如%) 控制流检查(break是否有switch和for,while) 一致性检查(inta;floata;) 相关名字检查、等等第二页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月20233§5.1属性文法

一、属性一、属性:一般用来描述客观存在的事物或人的特性。例如,学生的姓名、年龄、性别等;商品的颜色、重量、单价等。编译技术中用属性来描述计算机处理对象的特征。例如:X.Type,X.Place,X.val等分别描述X的类型,存储位置、值等不同的特征。 属性分两类: 综合属性:一般用于“自下而上”传递信息。 继承属性:一般用于“自上而下”传递信息。第三页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月20234二、属性文法

对于某个压缩了的上下文无关文法,当为每个文法符号引进一组属性,且让该文法中的重写规则附加以语义规则时,称该上下文无关文法为属性文法。

形式定义:一个属性文法形式上定义为一个三元组AG,AG=(G,V,E)。其中G表示一个上下文无关文法;V表示属性的有穷集;E表示属性的断言或谓词的有穷集。第四页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月20235三、综合属性

从语法分析树的角度来看,如果一个结点的某一属性,其值由子结点的属性之值来计算,则称该属性为综合属性。

综合属性用于“自下而上”传递信息。第五页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月20236例1:算术表达式求值的属性文法。规则式 语义规则1.L→E print(E.val)2.E→E1+T E.val:=E1.val+T.val3.E→T E.val:=T.val4.T→T1*F T.val:=T1.val*F.val5.T→F T.val:=F.val6.F→(E) F.val:=E.val7.F→digit F.val:=digit.lexval

与规则式关联的每一个语义规则的左部符号E,T,F等的属性值的计算由右部非终结符决定,这种属性称为综合属性。第六页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月20237LE.val=19F.val=5+T.val=4T.val=15F.val=4digit.lexval=4E.val=15T.val=3digit.lexval=5F.val=3digit.lexval=3*n求:3*5+4第七页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月20238四、继承属性 语法树分析中,若一个结点的某个属性之值由该结点的兄弟结点和/或父结点的属性之值来计算,则此结点的属性称为继承属性。 继承属性用于“自上而下”传递信息。第八页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月20239例2、说明语句中简单变量类型信息的属性文法。 规则式 语义规则

1.D→TL L.in:=T.type 2.T→int T.type:=integer 3.T→real T.type:=real 4.L→L1,id L1.in:=L.in addtype(id.entry,L.in) 5.L→id addtype(id.entry,L.in)过程addtype把每一个标识符id的类型信息(由L.in继承)登录在符号表的相关项id.entry中。DTLintL,ididT有一个综合属性type,其值为integer或real。L.in由T.type确定后逐步传递到下边有关结点使用。这种属性称为继承属性。第九页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202310五、属性的初始值①终结符号只有综合属性,它们由词法分析器提供。②非终结符号既有综合属性也可有继承属性,文法开始符号的所有继承属性作为属性计算前的初始值。第十页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202311§5.2

语法制导翻译法语法制导翻译法的基本思想:对文法的每一条产生式,设计语义子程序。在语法分析的过程中,当使用一条产生式推导或归约时,调用该语义子程序进行属性计算,完成预定的翻译工作。

语法制导翻译法:在语法分析的过程中,依随分析过程,根据每个产生式添加的语义动作进行翻译的方法。第十一页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202312语义子程序语义子程序也称为翻译子程序,语义动作。它描述了有关产生式所对应的翻译工作。语义动作一方面指出了产生式所对应的符号串的意义;另一方面又按照这种意义规定了对应的属性计算加工动作。 语义动作: 查填各种表格 计算某变量的值 生成某种中间代码 打印错误信息等等第十二页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202313LR分析制导的具体实现方法1、为文法产生式设计语义子程序。2、为文法构造一张无冲突的LR分析表。3、修改总控程序,归约时调用语义子程序。4、扩充LR分析栈,用来存放各文法符号对应的语义信息。例如:(1).E→E1+E2 {E.val=E1.val+E2.val}(2).E→E1*E2 {E.val=E1.val*E2.val}(3).E→(E1) {E.val=E1.val}(4).E→digit {E.val=lex.digit}第十三页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202314#第十四页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202315扩充的LR分析栈:׃׃׃S0׃׃׃#׃׃׃-状态栈文法符号栈语义值栈E.val=7E.val=1+E.val=61E.val=2*E.val=323(1).E→E1+E2

{E.val=E1.val+E2.val}(2).E→E1*E2

{E.val=E1.val*E2.val}(3).E→(E1) {E.val=E1.val}(4).E→digit {E.val=lex.digit}第十五页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202316步骤状态栈语义栈符号栈输入符号动作10-#1+2*3#S3203-#1+2*3#r4301-1#E+2*3#S44014-1-#E+2*3#S350143-1-#E+2*3#R460147-1-2#E+E*3#S5701475-1-2#E+E*3#S38014753-1-2-#E+E*3#R49014758-1-2-3#E+E*E#R2100147-1-6#E+E#R11101-7#E#acc第十六页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202317§5.3中间语言常用的中间语言有:一、逆波兰式二、三元式与间接三元式三、树形表示法四、四元式第十七页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202318一、逆波兰式1、逆波兰式(后缀式):每一运算符都置于其运算对象之后。(无括号表达式)

中缀表示 后缀表示

A*B AB* A+B*C ABC*+ (A+B)*(C+D) AB+CD+*

(a==0&&b>3)||(e&&x!=y) a0==b3>&&exy!=&&|| 第十八页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月2023192、LR分析制导生成逆波兰式文法:0 E′→E {空}1 E→E(1)+E(2) {print+}2 E→E(1)*E(2) {print*}3 E→(E(1)) {空}4 E→i {printi}步骤状态栈符号栈输入符号输出区10#a+b*c#203#a+b*c#301#E+b*c#a4014#E+b*c#a50143#E+b*c#a60147#E+E*c#ab701475#E+E*c#ab8014753#E+E*c#ab9014758#E+E*E#abc100147#E+E#abc*1101#E#abc*+第十九页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202320二、三元式与间接三元式一般形式:(op,AG1,AG2)例如:a:=-b*(c+d)三元式为:①(-,b,

)②(+,c,d)③(*,①,②)④(:=,③,a)第二十页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202321间接三元式例如:语句 X:=(A+B)*C Y:=D^(A+B)间接代码⑴⑵⑶⑴⑷⑸opAG1AG2⑴+AB⑵*⑴C⑶:=X⑵⑷^D⑴⑸:=Y⑷第二十一页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202322三、树形表示法抽象语法树:在语法树中去掉那些对翻译不必要的信息,从而获得更有效的源程序中间表示。这种变换后的语法树称为抽象语法树。+* 43 5 3*5+4的抽象语法树

第二十二页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202323树形表示

A*B+C*D+C*A*BD末端结点表示一个运算对象,每一个内结点表示一个一元或二元运算符。树形表示是三元式的翻版(3)+(1)*(2)*CABD第二十三页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202324四、四元式

一般形式:(op,AG1,AG2,result)

直观形式:result:=AG1opAG2例如:求x:=a+b*c的四元式。(*,b,c,T1) 直观式: T1:=b*c(+,a,T1,T2) T2:=a+T1(:=,T2,,x) x:=T2第二十四页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202325

采用自下而上的语法制导翻译法语义动作的设计(1)搞清楚源结构和目标结构(2)自下而上的语法制导翻译特点:栈顶形成句柄,归约时执行相应语义动作(3)给出从源结构到目标结构的变换方法§5.8自底向上语法制导翻译第二十五页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202326例.设文法及其相应的语义动作如下:S→a{print“2”}S→bTc{print“1”}T→R{print“3”}R→R/S{print“4”}R→S{print“5”}采用自下而上语法制导翻译,给出输入串bR/bTc/bSc/ac的翻译结果第二十六页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202327分析:首先对输入串

bR/bTc/bSc/ac画出语法树:ScTbRS/R/RS/RcTbaScTbRS再考虑归约时执行相应语义动作第二十七页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202328ScTbRS/R/RS/RcTbaScTbRSS→bTc{print“1”}S→a{print“2”}T→R{print“3”}R→R/S{print“4”}R→S{print“5”}14翻译结果为:53142431第二十八页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202329一、简单算术表达式和赋值语句的翻译定义几个过程和函数:lookup():检查是否出现在符号表中,如果在,则返回其指针;否则,返回NULL表示没有找到。emit(result:=AG1opAG2):产生一个四元式,并填入四元式表中。newtemp():该函数返回一个新的临时变量。第二十九页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202330文法:P2161.S→i=E{p=Lookup();if(p==NULL)error();elseemit(p’=’E.place}2.E→E(1)+E(2){E.place=newtemp();emit(E.place’=’E(1).place’+’E(2).place)}3.E→E(1)*E(2){E.place=newtemp();emit(E.place’=’E(1).place’*’E(2).place)}4.E→(E(1)){E.place=E(1).place;}5.E→i{p=Lookup();if(p!=NULL)E.place=p;elseerror();}第三十页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202331 算术表达式a+b*c翻译到三地址语句的过程:030$$a01$E014$E+0143$E+b-a-a--a--状态栈符号栈语义栈输入串a+b*c$+b*c$+b*c$b*c$*c$---第三十一页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202332*c$c$$$$$t1=b*ct2=a+t1

状态栈符号栈语义栈输入串014750147$E+E$E+E*014753$E+E*c014758$E+E*E0147$E+E01$E-a-b---a-b-c-a-t1-a-b--a-b-t2acc第三十二页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202333二、布尔表达式的翻译 1、E→E∨E 2、E→E∧E 3、E→E 4、E→(E) 5、E→idropid 6、E→id第三十三页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月2023341、类似算术表达式的翻译方法

(求每个因子,再求表达式的值)例如: 布尔表达式: a∨b∧c

三地址序列: T1:=c T2:=b∧T1 T3:=a∨T2第三十四页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月2023351.E→E(1)∨E(2){E.place=newtemp();

emit(E.place’=’E(1).place’∨’E(2).place)}2.E→E(1)∧E(2){E.place=newtemp();

emit(E.place’=’E(1).place’∧’E(2).place)}3.E→E(1){E.place=newtemp();

emit(E.place’=’’’

E(1).place}4.E→(E(1)){E.place=E(1).place;}5.E→i(1)ropi(2){E.place=newtemp();

emit(‘if’i(1).placerop.opi(2).place‘goto’next+3);emit(E.place’=’‘0’);emit(gotonext+2);emit(E.place’=’‘1’);}6.E→i

{E.place=i.place;}第三十五页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202336EE∨Ea<bE∧Ec<de<f第三十六页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月2023372、根据布尔表达式的特殊性采取某种优化措施A∨B ifAthentrunelseBA∧B ifAthenBelsefalseA ifAthenfalseelsetrue①对非终结符E赋予两个出口真出口:布尔表达式为真时,需转移的四元式地址。假出口:布尔表达式为假时,需转移的四元式地址。第三十七页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202338②设置两个语义变量:E.ture:用来记录表达式E对应的四元式需回填真出口的四元式的地址所构成的链。E.false:用来记录表达式E对应的四元式需回填假出口的四元式的地址所构成的链。③定义三个函数:第三十八页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202339链接函数merge(P1,P2):把以P1和P2为链首的两条链合并为一,返回合并后的链首(当P2=0时,返回P1;当P2≠0时,返回P2)。

intmerge(intP1,intP2){ intP; if(!P2)returnP1; else{ P=P2; while(P.result<>0) P=P.result; P.result=P1; returnP2;}第三十九页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202340回填函数backpatch(p,t):把p所链接的每个四元式的第四分量都回填为t。

voidBP(intp,intt){ intq=p; while(q){ intq1=q.result; q.result=t; q=q1; } return; }建链函数makelist(i):创建一个仅含i的新链表。第四十页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月202341④定义三种四元式:(jnz,a,-,p) ifagotop(当a为真时转向第p四元式)(jrop,x,y,p) ifxropygotop(j,-,-,p) gotop(无条件转向第p四元式)⑤四元式表的指针nextquad(nextq):每执行一次emit后,nextq自动加1。⑥E.code:为及时回填转移地址,使用语义变量E.code记录表达式E的第一个四元式语句序号。第四十一页,共四十九页,编辑于2023年,星期三第五章语法制导翻译和中间代码产生14六月2023421.E→i {E.tr=next; E.fa=next+1; E.code=next;emit(ifi.placegoto-);emit(goto_);}2.E→i(1)ropi(2){E.tr=next; E.code=next; E.fa=next+1;emit(ifi(1).placerop.opi(2).placegoto_); emit(goto_);

}3.E→(E(1)){E.code=E(1).code; E.tr=E(1).tr; E.fa=E(1).fa; }4.E→E(1)

{E.tr=E(1).fa; E.fa=E(1).tr; }5.E→E(1)∨E(2){bp(E(1).fa,E(2).code); E.code=E(1).code;E.tr=merg(E(1).tr,E(2).tr); E.fa=E(2).fa;}6.E→E(1)∧E(2){bp(E(1).tr,E(2).code); E.code=E(1).code;E.tr=E(2).tr; E.fa=merg(E(1).

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论