西北工业大学编译原理课件第五章 语法制导翻译及中间代码生成7.pptVIP

西北工业大学编译原理课件第五章 语法制导翻译及中间代码生成7.ppt

  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文档。上传文档
查看更多
5.9 说明语句的翻译 说明语句的作用是指明被说明的量的一些具体属性,如类型、种属、存储分配特点及其它属性等等。 编译程序对说明语句进行处理的主要任务是把有关属性填入符号表相应登记项中。 说明语句主要有变量定义(也称类型说明)语句、数组说明语句及类型定义语句等 5.9.1 类型说明语句的翻译 类型说明语句的常见形式为 类型名 变量名表 其中,类型名可以是程序设计语言提供的简单数据类型名(如integer、real、boolean等)或是程序员自己定义的数据类型(如结构、联合类型等)的名字。 变量名表是以逗号隔开的变量或数组名。为了叙述方便,我们假定简单类型名只有int、real、boolean三种(其它简单类型的处理与其类似),而自定义数据类型名的处理将在5.9.2节中讨论。 我们假定数组名具有形式 name[l1..u1 , l2..u2 , … , ln..un] ,其中, li ,ui (i=1,2,…,n)为整型常数,且满足li ui 。 类型说明的属性翻译文法 为了区分一般变量与指针,我们在符号表中引入一个标志域IsPointer,当其为真(=1)时表示该变量为指针,否则(=0)为一般变量。另外,我们假定指针变量的定义形式与C语言相同。 5.9.2 数据类型定义语句的翻译 一般说来,常用的高级语言(如PASCAL、C、JAVA等)都支持复杂的数据类型,这些数据类型除了系统提供的常用类型外,还允许用户自定义复杂的数据类型,如PASCAL中的RECORD语句、C语言中的 struct定义语句等等。 要实现这类语句的翻译,首先应有合理的数据结构来存储复杂数据类型的各种信息。其次,由于复杂数据类型实际上是由多层次、复合使用简单数据类型定义和变量(分量)定义而建立的,所以,处理好数据类型分量定义与变量定义的关系,以及分量为复杂类型时的递归、嵌套问题是实现数据类型定义语句翻译的关键。 由于处理上述问题的方法极其复杂,本节仅概要地介绍翻译这类语句的基本思想,有兴趣的读者可参阅有关文献。 本章结束语 至此,我们已对常见程序设计语言的一些语法结构讨论了语法制导翻译方法。 当然,所讨论的范围不可能包罗程序设计语言的一切语法结构,也不能涉及语义处理的全部细节. 我们仅希望大家通过对前面所介绍内容的学习,能够得到一点带规律性的启示,以便在今后的工作中有所借鉴。 Varable → iden {$$=Entry($1);/*变量在符号表中序号*/ VarList[$$].CAT=SimVar;/*种属为简单变量*/ VarList[$$].IsPointer=0;/*指针标志*/ VarList[$$].ADDR=NULL;/*尚未分配内存空间,下同*/} | ‘*’ iden /*指针*/ {$$=Entry($1);/*变量在符号表中序号*/ VarList[$$].CAT=SimVar;/*种属为简单变量*/ VarList[$$].IsPointer=1;/*指针标志*/ VarList[$$].ADDR=NULL; } | ArrayVar{$$=$1;} ArrayMSG → iden [ number .. number { $$=Entry($1); VarList[$$].CAT=Array;/*种属为数组*/ VarLIst[$$].IsPointer=0; VarList[$$].ADDR-DIM=1; /*记录维数;下面为内情向量申请空间,并填入第一维下标信息,其中,前两个单元(下标为[0]和[1])用来存放a、C之值 (此时暂不填写),n值可由DIM保存,因此不必另存。*/ VarList[$$].ADDR-Vector=malloc(5*sizeof(int)); VarList[$$].ADDR-Vector[2]=$3;/*第一维下界*/ VarList[$$].ADDR-Vector[3]=$5;/*第一维上界*/ VarList[$$].ADDR-Vector[4]=$5-$3+1/*第一维界差*/ } | *iden [ number .. number /*指针数组*/ { $$=Entry($1); VarList[$$].CAT=Array;/*种属为数组*/ VarList[$$].IsPointer=1; VarList[$$].ADDR-DIM=1;/*记录维数. 下面的填写工作与上 一产生式相同,注释略*/ VarList[$$].ADDR-Vector=malloc(5*sizeof(int)); VarList[$$].ADDR-Vector[2]=$4;/*第一维下界*/ V

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档