编译第7章1.ppt
上传人:sy****28 上传时间:2024-09-14 格式:PPT 页数:53 大小:1.8MB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

编译第7章1.ppt

编译第7章1.ppt

预览

免费试读已结束,剩余 43 页请下载文档后查看

16 金币

下载此文档

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

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

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

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

第7章语法制导翻译和中间代码生成语义处理静态语义分析通常包括语义处理方法虽然形式语义学(如指称语义学、公理语义学、操作语义学等)的研究已取得了许多重大的进展,但目前在实际应用中比较流行的语义描述和语义处理的方法主要还是属性文法和语法制导翻译方法.属性文法是Knuth在1968年提出的.所谓属性,其涉及的概念比较广泛,常用以描述事物或人的特征、性质,品质等等。比如,谈到一个物体,可以用“颜色”描述它,谈起某人,可以使用“有幽默感”来形容他。对编译程序使用的语法树的结点,可以用“类型”、“值”或“存储位置”来描述它。它是在上下文无关文法的基础上,为每个文法符号(终结符或非终结符)配备若干相关的“值”(称为属性)。1、属性文法定义属性文法举例属性文法记号中常使用N.t的形式表示与非终结符N相联的属性t。比如可把对上面表达式的类型检查的属性文法写成图7.2的形式。2、属性分类(1)例:简单算术表达式求值的语义描述属性文法(语法制导定义)属性分类(2)例:说明语句语法制导定义(属性文法)属性的计算例:3*5+4的分析树与属性计算例:realid1,id2,id3的分析树和属性计算在语法分析的过程中,随着分析的步步进展,根据每个产生式所对应的语义子程序边分析边翻译的方法。注:1)语法制导翻译时会根据文法产生式右部符号串的含义,进行翻译,翻译的结果是生成相应中间代码。2)语法制导翻译的依据是语义子程序。3)每个产生式均配置一个语义子程序,当语法分析进行归约和推导时,就调用相应语义子程序,完成一部分翻译任务。4)语法分析完成,翻译工作也告结束。常用的中间代码(语言)形式:Operand1Operand2Operator语句相应的逆波兰表示形式:表达式求值的算法逆波兰:ABCD-*+ECD-N^/+形式:(Operator,Operand1,Operand2)注:1)这里三元式本身作为存放结果的单元2)为了在其它三元式中利用当前三元式的结果,需要对三元式进行编号。3)三元式的编号就作为相应三元式的结果值。例:A+B*(C-D)+E/(C-D)^N3、树形表示例:A+B*(C-D)+E/(C-D)^N形式:(Operator,Operand1,Operand2,Result)注:1)通过语法制导翻译所生成的四元式中,Operand1,Operand2,Result可能是用户自定义的变量,也可能是编译时引进的变量。2)四元式中变量采用符号表入口的地址,而不用变量的地址,因为语义分析不仅需要变量的地址,还需要从符号表查到的变量的属性、类型和地址等。3)四元式的优点是容易转换为目标代码和容易进行优化。常用的三地址语句对应的四元式(2)EE1+E2{E.place:=newtemp;emit(+,E1.place,E2.place,E.place);}(3)EE1*E2{E.place:=newtemp;emit(*,E1.place,E2.place,E.place);}(4)E-E1{E.place:=newtemp;emit(uminus,E1.place,_,E.place);}(5)E(E1){E.place:=newtemp;E.place:=E1.place}(6)Eid{E.place:=newtemp;P:=lookup(id.name);ifPnilthenE.place:=Pelseerror();}每个表达式中可能出现各种不同类型的变量或常数,此时应该进行类型转换的语义处理。为此增加:E.type:E的类型信息itr:将整型转换成实型*i,*r分别表示int和real类型的乘法运算;对第3条产生式的语义描述为:elseifE1.type=realANDE2.type=realthenbeginemit(E.place“:=”E1.place“*r”E2.place);E.type=realendelseifE1.type=int//ANDE2.type=realthenbegint:=newtemp;emit(t“:=”“itr”E1.place);emit(E.place“:=”t“*r”E2.place);E.type=realendElsebegint:=newtemp;emit(t“:=”“itr”E2.place);emit(E.place“:=”E1.place“*r”t);E.type=realend}7.5布尔表达式的翻译在本节中我们考虑由下列文法产生的布尔表达式:E→EorE|EandE|notE|(E)|idrelopid|true|false说明:我们使用relop的属性relop.