计算机编译chapt.pptVIP

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

第六章 代码生成和代码优化 第o节 符号表 在程序中,用户用标识符定义了不少名字来代表不同的数据对象,编译程序将这些名字保存在符号表中。符号表除了记录名字本身而外,还记录了与名字关联的各种属性信息。 一. 符号表的一般形式 每个名字对应一个表项,一个表项包括名字域和信息域。 其中,信息域通常设若干子域及标志位,其内容可以是和名字有关的任何信息: 类型,种属,长度,相对地址,数组的内情向量,记录与分量的联系,形参标志,说明标志,赋值标志等。 因名字的长度、信息域的组成及长度可能是各不相同的,一般采用间接表技术。 二. 常用的符号表结构 1. 线性表: 用N个数组A1,A2,…,AN来存放符号表的N个子域 2. HASH表 第一节 语义分析和中间代码生成 O. 概述 1. 语义分析的主要工作 (1)语义检查: 如类型是否一致,数组维数是否正确。 (2)语义处理: 对说明语句,登记信息;对可执行语句,生成中间代码。 2. 语法制导翻译 为每个产生式配上一个语义子程序,在语法分析过程中,当用一个产生式进行匹配或归约时,就调用相应的语义程序。 上述语义子程序既可能包含了语义检查,也可能包含了语义处理,其核心是为了生成相应的中间代码。 例:语法分析采用自底向上的LR分析法 X?AB Y?CD Z?XY 一. 四元式 形式: (op,ARG1,ARG2,RESULT) op—运算符, ARG1—第一运算量, ARG2—第二运算量, RESULT—结果 如: A:=-B*(C+D) 翻译成 (@,B,_,t1) (+,C,D,t2) (*,t1,t2,t3) (:=,t3,_,A) 由此可见: 四元式出现顺序和表达式计值顺序一致; 四元式之间的联系是通过临时变量实现的。 二.简单赋值语句的翻译 1. 语义变量及过程 (1)X.a:文法符X的相应属性a 如i.name, E.place (2)lookup(a):语义函数, 为名字a查符号表;返回: a在符号表中的位置或nil (3)newtemp:语义函数,每调用一次就返回一个可用的临时变量地址 (4)emit:语义过程,产生四元式并送到GAM的代码存储器ip指向位置 (5)ip:指令指针,一般设初值为0,也可指定一个初值,每调用一次emit,ip自动加4 (6)error:语义过程,错误处理 2. 翻译方案 A→i:=E { p:=lookup(i.name); if p nil then emit ( :=,E.place,_,p) else error} E→E1 op E2 { E.place:=newtemp; emit(op,E1.place,E2.place,E.place) } E →-E1 { E.place:=newtemp; emit(@,E1.place,_,E.place) } E →(E1) { E.place:= E1.place } E →i { p:=lookup(i.name); if pnil then E.place:=p else error } 举例: a:=-b*(c+d)的移进-归约过程 a:=-b*(c+d) a:=-E1*(c+d) a:=E2*(c+d) a:=E2*(E3+d) a:=E2*(E3+ E4) a:=E2*(E5) a:=E2*E6 a:=E7 A 3. 类型转换 对表达式E增加类型属性E.type; 引进类型转换指令(itr,x,_,t) E→E1 op E2的语义子程序如后 三. 含数组元素的赋值语句的翻译 1. 数组元素的地址计算公式 (1)数组定义的一般形式 array A[l1:u1,l2:u2,. . .,ln:un] of integer 其中:lk、uk分别称为第k维的下、上界; dk=uk-lk+1 称为第k维维长; A[i1,i2,…,in]为某一数组元素。 (2)按行存放时的地址公式 设每个元素占一个存储单元,则A[i1,i2,…,in]的地址 D=a+(i1-l1)*d2*d3*…*dn+(i2-l2)*d3*d4*…*dn +…+(in-1-ln-1)*dn+(in-ln) D=CONSPART+VARPART CONSPART=a-

文档评论(0)

panguoxiang + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档