在编译程序工作的过程中.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文档。上传文档
查看更多
在编译程序工作的过程中,编译程序的工作过程,程序编译过程,c程序编译过程,程序的编译过程,java程序编译过程,编译器的工作过程,c语言程序的编译过程,编译器工作过程,编译器设置验证过程中

第六章 符号表 在编译程序工作的过程中,需要不断收集、记录和使用源程序中一些语法符号的类型和特征等相关信息. 这些住处一般以表格形式存储于系统中.如常数表、变量名表、数组名表、过程名表、标号表等等,统称为符号表。 对于符号表组织、构造和管理方法的好坏会直接影响编译系统的运行效率。 6.1 符号表的组织 符号表的组织涉及数据结构方面知识(略) 对符号表的访问常见操作有: (1)判定一给定的名字是否在表中; (2)在表中填入一个新名字; (3)访问与给定名字相关的信息; (4)为给定的名字填入或更新其某些信息; (5)从表中删除一个或一组名字 须指出,在很多程序设计语言中,对名字的作用域有相应的规定,即同一名字的标识符,在不同的作用域里标识了不同的对象,且占用了不同的存储空间. 因此,在组织符号表时,应能反映各个标识符的作用域. 6.2 分程序结构语言符号表的建立 分程序结构语言 用其所写的程序单元(program unit)中,可以再包含嵌套的程序单元,且其中每个程序单元均可定义属于自己的一组局部变量.如PASCAL中的过程说明,C中花用括{}号括起来的分程序或复合语句等. 程序单元的嵌套导致了变量作用域的嵌套,故把允许名字作用域嵌套的语言称为具有~的语言. PASCAL是典型的~之一. 虽然C不是~的语言,但其函数定义中的函数体可以是一个嵌套的分程序,因而也涉及到各个局部变量的作用域. 对于嵌套的作用域,同名变量在不同处代表了不同的实体,因此,需采用分层建立和处理符号表的方式. PASCAL语言符号表的构造 在PASCAL程序中,标识符的作用域是包含说明(定义)该标识符的最小分程序.即: ①若一标识符在某分程序首部已作说明,则它在整个分程序内均有定义,除非它在某内层分程序被再次定义.即它的作用域是整个分程序,是本层分程序及内层分程序的全局量; ②程序中的标号局限于定义该标号的最小分程序; ③我们可将PASCAL的每个过程视为分程序,其参数总是局限于相应的过程体内. 查填表方案 为了表征一PASCAL程序中各个分程序的嵌套层次关系,我们可将分程序按其开始符号出现的顺序编号,在扫描源程序时亦可按这一顺序进行处理.方法是 当在一分程序首部某说明中扫描到一个标识符时,以此标识符查相应于本层分程序的符号表,若表中已有此项,则它被重复说明,出错;否则,在表中新登记一项,将该符号及其相关信息填入. 在分程序执行语句中遇一标识符时,首先查本层表,若找不到,则查直接外层的符号表,如此等等,若在某层查到,则可使用相关信息;若遍查所有外层均未找到,则无定义,出错. 符号表组织方式 为实现上述方案,应这样组织符号表: 分层组织符号表的登记项,使各分程序的符号表登记项连续存放,而不被内层分程序的符号表分割; 建立一个“分程序表”,用来记录各层分程序符号表的有关信息.该表有三个域: ①OUTERN 指明该分程序的直接外层分程序的编号; ②ECOUNT 记录该分程序在符号表登记项个数; ③POINTER 指向该分程序在符号表中的起始位置; 构造符号表的算法 1.初始化: CURRBL =0; LASENT=0; LASTBL=0; TOPENT=0; /*注:以上各量在下面的程序中分别简记为CB,LE,LT,TE*/ 2.(1)当进入分程序的首符号或过程时: B[++LT].OUTERN=CB; B[LT].ECOUNT=0; B[LT].POINTER=TE; CB=LT; (2) 遇到分程序中的定义性出现时: TP--;S[TE]=相关信息; B[CR].ECOUTN++; B[CR].POINTER=TE; (3)遇到END时: B[CB].POINTER=LE+1; for(k=1; k=B[CB].EC; k++) S[++LE]=S[TE++]; CB=B[CB].OUTERN; 3.重复2.,直到扫描结束. 对于前面的程序结构,其构造符号表的过程见教材中P266图6-5 6.3 非分程序结构语言符号表的建立 我们以FORTRAN语言为例,介绍其符号表的构造. FORTRAN是块结构语言.FORTRAN程序由一或多个相对独立的程序段组成,其中有唯一的主程序段,其余为子程序段(FUNTION,SUBROUTINE,BLOCK DATA). 程序段间的信息传递是由形实结合及公共数据区实现的.因此,程序段名及公共区名是全局量,而各段中定义的变量均是局部量. FORTRAN语言的编译一般是把每个段视为独立程序单元进行的.为各段产生相应的代码,再连接装配成一完整的目标程序. 因此,当一程序段编译完毕,该段的局部量已完成使命,可从表中删除,但全局量仍需保留. 我们可为其建立两个表:全局符号表及局部符号表.其中局部表是可重复使用的;

文档评论(0)

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

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

1亿VIP精品文档

相关文档