- 1、本文档共72页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第5章语义分析和中间代码生成
语义分析和中间代码生成;本章要求;语义分析和中间代码生成所处的位置:;1. 语义分析和中间代码生成在编译器中的位置:;;1、逆波兰式:
运算对象写在前,运算符写在后(后缀表示形式)
例:a+b ? ab+
(a+b)*c ? ab+c*
a+b*c ? abc*+
a:=b*c+b*d ? abc*bd*+:=;练习;后缀式的推广;;;练习;到目前为止,已知 输入的语法单位,又知道 要翻译的结果的形式,翻译的方法是什么?;属性文法;;;digit?lexval:=3;C语言中变量定义:
int id1,id2,id3;语义规则描述的工作:
属性计算、静态语义检查、符号表的操作、代码生成等,通常写成过程和函数调用,称为语义子程序。
语义翻译常用的方法:
语法制导翻译:定义翻译所必须的语义属性和语义规则,一般不涉及计算顺序。;语法制导翻译技术;语法制导翻译的处理方法;;语义子程序的一般形式
语义子程序写在该产生式后面的花括号内:
(1) X?… { 语义子程序1 }
(2) Y?… { 语义子程序2 }
(3) A?XY { 语义子程序3 }
例:台式计算器程序的语义子程序描述:
产生式 语义子程序
(0) S’?E {PRINT E.VAL}
(1) E?E(1)+E(2) {E.VAL:=E(1).VAL+E(2).VAL}
(2) E?E(1)*E(2) {E.VAL:=E(1).VAL*E(2).VAL}
(3) E?(E(1)) {E.VAL:= E(1).VAL}
(4) E?i {E.VAL:=LEXVAL};各种语句的翻译;常见的语法制导翻译类型:
语法分析采用自底向上方法时,使用与语法分析栈同步操作的语义栈进行语法制导翻译。
语法分析采用递归下降分析方法时,利用隐含堆栈存储各递归子程序中的局部变量所表示的语义信息
语法分析采用LL(1)分析法时,利用翻译文法进行语法制导的翻译。翻译文法是在描述语言的文法中加入语义动作的符号。
利用属性文法进行翻译。属性文法也是一种翻译文法,它的文法符号和动作符号都带有语义属性和同一产生式中各属性间的运算规则。;自底向上的语法制导翻译;自底向上翻译的特点;例1:下面是一个算术表达式文法,每个产生式右边是它的语义动作,对输入串2* 3 + 2的规范归约的分析过程如下:;;Evaluation only.
Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.
Copyright 2004-2011 Aspose Pty Ltd.;;例2:在2*3+2的LR分析过程中增加了语义栈??的语法制导的实现过程。;;结论;说明语句的翻译;变量说明语句的翻译;3. 翻译的语义动作;VAR id1,id2,id3:integer;的归约过程;常量说明语句的翻译;Constant A=123;可执行语句的翻译;简单赋值语句的翻译;3. 简单赋值语句的翻译
此处只假定是整数运算;例:赋值句A:=B+C*(-D)的自底向上分析 设:翻译此赋值句之前四元式的最大编号为K;;因此,四元式表中增加了4条四元式:;布尔表达式的翻译;布尔量翻译为两条四元式:
(jnz, A,_,P): 真出口,当A为真时跳转到四元式P
(j, _,_,q) : 假出口,无条件跳转到四元式q
关系表达式也翻译为两条四元式:
(jrop, i1, i2, P) : 真出口,当i1 rop i2为真时转四元式P
(j, _,_,q) : 假出口,无条件跳转到四元式q;解决方法是:回填技术
已知就直接填入;不知时先填0,等知道后再返填
若多个因子的转移去向相同,但又不知道具体位置,应该用链将这些未知且出口相同的四元式链在一起。
布尔表达式: A and B and CD 的四元式为: ;将P1,P2为链首两个四元式链合并在一起,可以用下述过程,返回合并后的四元式链首:;假出口链上的四元式应转向相同的位置,所以一旦知道转向的真实位置,就应返填,返填是将已知位置填入链上的所有四元式的第四个分量。
用backpatch,把已知位置t填入以P为链首的四元式中:;;;5. 翻译布尔表达式时,当读到not, and, or时,要进行归约,因此应对文法进行改造,改造前后的文法为:; 6. 总结前面的分析,各产生式的翻译为:;;控制语句的翻译;IF语句的翻译;2. IF语句的目标结构及其翻译
无else的结构;2. IF语句的目标结构及其翻译
有else的结构;例:将下面的IF语句翻译为四元式序列;练习:将下面的语句翻译为四元式序列;REPEAT语句的翻译;;将下面
文档评论(0)