语义分析和中间代码生成

语义分析和中间代码生成

ID:46966305

大小:349.50 KB

页数:80页

时间:2019-12-01

语义分析和中间代码生成_第1页
语义分析和中间代码生成_第2页
语义分析和中间代码生成_第3页
语义分析和中间代码生成_第4页
语义分析和中间代码生成_第5页
资源描述:

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

1、第七章语义分析和中间代码生成典型的编译程序的逻辑结构S.PO.P语义分析与中间代码生成目标代码生成程序代码优化语法分析程序词法分析程序出错处理信息表管理语义分析通常包括:(1)类型检查。验证程序中执行的每个操作是否遵守语言的类型系统的过程.,编译程序必须报告不符合类型系统的信息。(2)控制流检查。控制流语句必须使控制转移到合法的地方。例如,在C语言中break语句使控制跳离包括该语句的最小while、for或switch语句。如果不存在包括它的这样的语句,则就报错。(3)一致性检查。在很多场合要求对象只能被定义一次。例如Pascal语言规定同一标识符在一个分程序中只能被说明

2、一次,同一case语句的标号不能相同,枚举类型的元素不能重复出现等等。(4)相关名字检查。有时,同一名字必须出现两次或多次。例如,Ada语言程序中,循环或程序块可以有一个名字,出现在这些结构的开头和结尾,编译程序必须检查这两个地方用的名字是相同的。(5)名字的作用域分析如何实现语义分析?语法制导翻译中的方法和技术应用于语义分析中。◆“中间代码生成”程序的任务是:把经过语法分析和语义分析而获得的源程序中间表示翻译为中间代码表示。◆方法:语法制导翻译。◆采用独立于机器的中间代码的好处:1.便于编译系统的建立和编译系统的移植;2.便于进行独立于机器的代码优化工作。7.1中间语言图

3、表示法后缀式三地址代码表示7.1.1图表示法抽象语法树和DAG图抽象语法树语法树可以作为一种合适的中间语言形式。在语法树中去掉那些对翻译不必要的信息,从而获得更有效的源程序中间表示。这种经变换后的语法树称之为抽象语法树(AbstractSyntaxTree)。在抽象语法树中,操作符和关键字都不作为叶结点出现,而是把它们作为内部结点,即这些叶结点的父结点如产生式S→ifBthenS1elseS2抽象语法树表示if-then-elseBS1S2=a+*bc-(a)抽象语法树*-cba=b*-c+b*-c表达式a+a*(b-c)+(b-c)*d的DAG+*d+*a–cb=a+*b

4、c-(b)dag(DirectedAcyclicGraph)DAG图7.1.2三地址代码◆一般形式x:=yopz=a+*bc-t1:=-ct2:=b*t1t3:=t2+t2a:=t3相应于dag的三地址代码7.1.3三地址语句的种类(1)赋值语句x:=yopz,op为二目算术算符或逻辑算符;(2)赋值语句x:=opy,op为一目算符,如一目减uminus、逻辑非not、移位算符(3)复制语句x:=y;(4)无条件转移语句gotoL;(5)条件转移语句ifxrelopygotoL,关系运算符号relop(<,=,>=等等);(接上页)(6)过程调用语句paramx和callp

5、,n;过程返回语句returny;(7)索引赋值x:=y[i]及x[i]:=y;(8)地址和指针赋值x:=&y,x:=*y和*x:=y。7.1.4三地址代码的表示方法1.四元式op,arg1,arg2,result2.三元式op,arg1,arg23.间接三元式间接码表+三元式表对于语句a=b*-c+b*-c的三种表示方法(0)(1)(2)(3)(4)(5)-*-*+=cbcbt2t5arg1t1t3t4arg2resultt1t2t3t4t5aop三地址语句的四元式表示◆四元式需要利用较多的临时单元,四元式之间的联系通过临时变量实现。(0)(1)(2)(3)(4)(5)-

6、*-*+=cbcb(1)aarg1(0)(2)(3)(4)arg2op三地址语句的三元式表示三元式中使用指向三元式语句的指针。(0)(1)(0)(1)(2)(3)间接代码三地址语句的间接三元式表示(0)(1)(2)(3)-*+=cb(1)aarg1(0)(1)(2)arg2op7.2说明语句◆说明语句的翻译:对每个局部名字,在符号表中建立相应的表项,填写有关的信息如类型、嵌套深度、相对地址等。◆相对地址:相对静态数据区基址或活动记录中局部数据区基址的一个偏移量。7.2.1过程中的说明语句◆一个过程中的所有说明语句作为一组来处理。用一个全程变量Offset来记录下一个数据在活

7、动记录中的位置。P→D{offset:=0}D→D;DD→id:T{enter(id.name,T.type,offset);offset:=offset+T.width}T→integer{T.type:=integer;T.width:=4}T→real{T.type:=real;T.width:=8}T→array[num]ofT1{T.type:=array(num.val,T1.type);T.width:=num.val*T1.width}T→↑T1{T.type:=pointer(T1.type);T

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

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

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