语义分析与中间代码生成哈工大王宏志

语义分析与中间代码生成哈工大王宏志

ID:46570348

大小:1.91 MB

页数:126页

时间:2019-11-25

语义分析与中间代码生成哈工大王宏志_第1页
语义分析与中间代码生成哈工大王宏志_第2页
语义分析与中间代码生成哈工大王宏志_第3页
语义分析与中间代码生成哈工大王宏志_第4页
语义分析与中间代码生成哈工大王宏志_第5页
资源描述:

《语义分析与中间代码生成哈工大王宏志》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第6章语义分析与中间代码生成SchoolofSoftwareHarbinInstituteofTechnology重点:三地址码,各种语句的目标代码结构、语法制导定义与翻译模式。难点:布尔表达式的翻译,对各种语句的目标代码结构、语法制导定义与翻译模式的理解。8/7/20212第6章语义分析与中间代码生成6.1中间代码的形式6.2声明语句的翻译6.3赋值语句的翻译6.4类型检查6.5控制结构的翻译6.6回填6.7switch语句的翻译6.8过程调用和返回语句的翻译6.9输入输出语句的翻译6.10本章小结8/7/202136.1中间代码的形式中间代码的作

2、用过渡:经过语义分析被译成中间代码序列中间代码的形式中间语言的语句中间代码的优点形式简单、语义明确、独立于目标语言便于编译系统的实现、移植、代码优化常用的中间代码语法树(6.3.5节)逆波兰表示、三地址码(三元式和四元式)、DAG图表示8/7/202146.1.1逆波兰表示中缀表达式的计算顺序不是运算符出现的自然顺序,而是根据运算符间的优先关系来确定的,因此,从中缀表达式直接生成目标代码一般比较麻烦。波兰逻辑学家J.Lukasiewicz于1929年提出了后缀表示法,其优点为:表达式的运算顺序就是运算符出现的顺序,它不需要使用括号来指示运算顺序。8/

3、7/202156.1.1逆波兰表示例6.1下面给出的是一些表达式的中缀、前缀和后缀表示。中缀表示前缀表示后缀表示a+b+abab+a*(b+c)*a+bcabc+*(a+b)*(c+d)*+ab+cdab+cd+*a:=a*b+c*d:=a+*ab*cdabc*bd*+:=8/7/202166.1.2三地址码所谓三地址码,是指这种代码的每条指令最多只能包含三个地址,即两个操作数地址和一个结果地址。如x+y*z三地址码为:t1:=y*zt2:=x+t1三地址码中地址的形式:名字、常量、编译器生成的临时变量。8/7/202176.1.2三地址码例6.2赋

4、值语句a:=(-b)*(c+d)-(c+d)的三地址码如图6.1所示t1:=minusbt2:=c+dt3:=t1*t2t4:=c+dt5:=t3-t4a:=t5图6.1a:=(-b)*(c+d)-(c+d)的三地址码8/7/202186.1.2三地址码1.形如x:=yopz的赋值指令;2.形如x:=opy的赋值指令;3.形如x:=y的复制指令;4.无条件跳转指令gotoL;5.形如ifxgotoL(或iffalsexgotoL)的条件跳转指令;6.形如ifxrelopygotoL的条件跳转指令;6.过程调用和返回使用如下的指令来实现:paramx用

5、来指明参数;callp,n和y=callp,n用来表示过程调用和函数调用;returny表示过程返回;8.形如x:=y[i]和x[i]:=y的变址复制指令;9.形如x:=&y、x:=*y和*x:=y的地址和指针赋值指令。8/7/20219四元式四元式是一种比较常用的中间代码形式,它由四个域组成,分别称为op、arg1、arg2和result。op是一个一元或二元运算符,arg1和arg2分别是op的两个运算对象,它们可以是变量、常量或编译器生成的临时变量,运算结果则放入result中。图6.2(a)图6.1中三地址码的四元式表示8/7/202110三

6、元式为了节省临时变量的开销,有时也可以使用只有三个域的三元式来表示三地址码。三元式的三个域分别称为op,arg1和arg2,op,arg1和arg2的含义与四元式类似,区别只是arg1和arg2可以是某个三元式的编号(图6.2(b)中用圆括号括起来的数字),表示用该三元式的运算结果作为运算对象。图6.2(b)图6.1中三地址码的三元式表示8/7/202111生成三地址码的语法制导定义8/7/2021126.1.3图表示类似于表达式的抽象语法树一样,在dag(directedacyclicgraph)中,每个节点对应一个运算符,代表表达式的一个子表达式

7、,其子节点则与该运算符的运算对象相对应,叶节点对应的是变量或者常量,可以看成是原子运算。利用dag可以很容易地消除公共子表达式例6.3表达式a+a*(b-c)-(b-c)/d的dag如图6.5所示。图6.5a+a*(b-c)-(b-c)/d的dag图8/7/202113生成dag的语法制导定义产生式语义规则⑴E→E1+TE.node:=mknode('+',E1.node,T.node)⑵E→E1-TE.node:=mknode('-',E1.node,T.node)⑶E→TE.node:=T.node⑷T→T1*FT.node:=mknode('*

8、',T1.node,F.node)⑸T→T1/FT.node:=mknode('/',T1.node,F.n

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。