07语义解析和中间代码地产生.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
07语义解析和中间代码地产生

语义分析和中间代码的产生;在词法分析和语法分析之后,编译程序要进行静态语义检查和翻译 静态语义检查通常包括: 类型检查 控制流检查 一致性检查 相关名字检查 翻译为中间语言的好处: 便于进行与机器无关的代码优化 使编译程序改变目标机更容易 使编译程序的结构在逻辑上更为简单明确,以中间语言为界面,编译前端和后端的接口更清晰;1 中间语言;1.1 后缀式;;1.2 图表示法;;产生赋值语句抽象语法树的属性文法;赋值语句:a:=b*-c+b*-c 后缀式:a b c uminus * b c uminus * + assign;1.3 三地址代码;;;三地址语句的种类;;产生赋值语句三地址代码的属性文法;;三地址代码的具体实现;语句a:=b*-c+b*-c 的四元式表示:;(0) (1) (2) (3) (4) (5);语句 X:=(A+B)*C; Y:=D↑(A+B);2 说明语句;2.1 过程中的说明语句;计算说明语句中名字的类型和相对地址;;2.2 保留作用域信息;程序结构;sort a,x ;nil;;P→MD {addwidth(top(tblptr),top(offset)); pop(tblptr); pop(offset)} M→ε {t:=mktable(nil); push(t,tblptr); push(0,offset)} D→D1;D2 D→proc id; N D1;S {t:=top(tblptr); addwidth(t,top(offset)); pop(tblptr);pop(offset); enterproc(top(tblptr),id.name,t)} ;D→ id: T {enter(top(tblptr),id.name,T.type, top(offset)); top(offset):= top(offset) +T.width} N→ε {t :=mktable(top(tblptr)); push(t,tblptr);push(0,offset)} 如下操作: 1. mktable( previous)创建一张新符号表 2. enter(table,name,type,offset)插入表项 3. addwidth(table,width)记录总域宽 4. enterproc(table,name, newtable) 建立过程新表项;;;;2.3 纪录中的域名;3 赋值语句的翻译;3.1 简单算术表达式及赋值语句;S→id:=E {p:=lookup(id.name); if pnil then emit(p:= E.place) else error } E→E1+E2 {E.place=newtemp; emit(E.place:=E1.place+E2.place)} E→E1*E2 {E.place=newtemp; emit(E.place:=E1.place*E2.place)} E →-E { E.place:=newtemp; emit(E.place ′ := ′ ′uminus′E1.place};E→(E1) {E.place:=E1.place} E→id {p:=lookup(id.name); if pnil then E.place:=p else error} lookup(id.name)= id.entry nil emit 将生成的三地址代码送到输出文件上。 语义动作应包括类型分析,文法符号应有类型属性,在类型分析的基础上,进行相容和赋值相容检查,生成类型转换的三地址代码; 3.2 数组元素的引用;对于二维数组情况尤其应注意: 若二维数组A按行存放,则可用如下公式计算A[i1,i2]的相对地址:

文档评论(0)

静待花开 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档