编译7语义分析和中间代码产生1(zss)

编译7语义分析和中间代码产生1(zss)

ID:46514470

大小:545.00 KB

页数:39页

时间:2019-11-24

编译7语义分析和中间代码产生1(zss)_第1页
编译7语义分析和中间代码产生1(zss)_第2页
编译7语义分析和中间代码产生1(zss)_第3页
编译7语义分析和中间代码产生1(zss)_第4页
编译7语义分析和中间代码产生1(zss)_第5页
资源描述:

《编译7语义分析和中间代码产生1(zss)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、编译原理(第三版)陈火旺等编著(2012年9月-12月)主讲:朱世松计算机学院概述一、语义分析的任务审查每一个语法结构的静态语义,即验证语法正确的结构是否有意义。如:赋值语句:x=x+y,左边变量类型与右边变量类型是否一致。在语义正确的基础上生成一种中间代码或目标代码。10/4/20212二、语义分析的范围1.确定类型:确定标识符所关联的数据类型。2.类型检查:按语言的类型规则,检查运算的合法性与运算分量类型的一致性,必要时作类型转换。3.识别含义:根据语言的语义定义(形式或非形式),识别程序中各构造成分组合到一起的含义,并作相应的语义处理(生成中间代码或

2、目标代码)4.控制流检查:控制流语句必须转移到合法的地方。如:C中,break语句规定跳出最内层的循环或switch语句.10/4/202135.一致性检查:在很多场合要求对象只能被说明一次(避免重复定义)。6.相关名字检查:如:Ada,循环或块可以有一个名字,它出现在这些结构的开头或结尾。编译程序必须检查这两个地方用的名字是否相同。10/4/20214三、语义描述工具和语义分析方法语义描述工具目前流行:用属性文法作为描述语义的工具。语义分析方法根据描述属性文法的语义规则的方式不同,语义分析方法分为:语法制导定义方法翻译方案10/4/202151中间语言中

3、间语言:它介于源程序到目标语言程序中间程序的语言中间语言程序:用中间语言表示的程序。作用:用于编译程序,将源程序翻译成等价的中间语言程序,再将中间语言程序转化成目标程序(即将语义分析和目标代码生成分开处理)源程序中间语言程序目标程序中间语言是表示语法制导翻译的结果。等价变换转化7.1中间语言10/4/20216好处:中间语言与机器无关,使采用中间语言进行翻译的编译程序系统易于移植。易于优化翻译后的代码。使编译程序的结构在逻辑上更简单明确。2中间语言的表示常见:逆波兰表示四元式表示和三地址代码、三元式图表示:DAG和树形表示10/4/202177.1.1逆波

4、兰表示由波兰逻辑学家J.Lukasiewicz(卢卡西维兹)首先提出用来表示表达式的方法,后来推广到表示程序设计语言中的其它语法成分。表达式的逆波兰表示表达式的表示:中缀表示:运算符居中,运算对象在左右两边:a+b波兰表示:前缀表示:运算符在前,运算对象在后:+ab后缀表示:运算对象在前,运算符在后:ab+…(逆波兰表示)10/4/20218例:逆波兰表示的例子中缀表示(一般表示)逆波兰表示a+bcabc+a(b+c/d)abcd/+ab+cabc+ab+(c-d)/eabcd-e/+10/4/20219(1)表达式逆波兰表示的定义:设E是一般表达式,则:

5、一般表达式逆波兰表达式若E为变量或常量E(E)E的逆波兰式E(1)opE(2)(二目运算)E(1)的逆波兰式E(2)的逆波兰式opopE(单目运算)E的逆波兰式op10/4/202110把表达式翻译成后缀式的语义规则描述产生式E→E(1)opE(2)E→(E(1))E→id语义动作E.code:=E(1).codeE(2).codeopE.code:=E(1).codeE.code:=idE.code表示E后缀形式op表示任意二元操作符“”表示后缀形式的连接。10/4/202111(2)逆波兰表示的特点a.标识符(运算对象)出现的顺序(从左到右)和原有顺序

6、相同。b.运算符是按实际计算顺序(从左到右)出现的。c.运算符紧跟在运算对象的后面出现,并且没有括号。10/4/202112(3)好处:易于对表达式的计算处理对于一般表达式的计算,系统需要用两个工作栈分别处理运算对象和运算符。对于逆波兰表示的表达式计算处理只用一个工作栈。一般的计算过程是:自左至右扫描后缀式,每碰到运算量就把它推进栈。每碰到k目运算符就把它作用于栈顶的k个项,并用运算结果代替这k个项。10/4/202113例:逆波兰式ab+c的计算处理过程遇运算对象a,b入栈扫描ab+cba栈遇二目运算符+c取出a,b,运算结果T入栈TcT取出c,T作运算

7、,设结果T1T1遇运算符c遇运算对象c入栈10/4/2021142.形成逆波兰表示怎样将一般表达式转换成逆波兰表示?基本思想:从左到右扫描表达式,每遇到:1o表达式中的运算对象则往左去。2o表达式中的运算符,则与运算符栈顶元素比较优先数:10/4/202115逆波兰表示表达式运算对象运算符进栈出栈运算符栈如果运算符栈顶元素的优先数大于或等于表达式中当前的运算符优先数,则栈顶元素退栈向左去。然后当前运算符继续与栈顶的新元素比较优先数。直到栈顶元素的优先数小于表达式中当前运算符为止。此时,才将表达式中当前运算符进栈。10/4/202116例:画出形成表达式a(

8、b+c/d)的逆波兰表示过程a(b+c/d)##步骤①a(b+c/

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

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

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