- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
则有相应的分程序结构表,如图: 表达式a=b+c+d中的a是第二层中的a(float a);b是第一层定义的b(float b);c是第三层定义的c(float c);d是第四层定义的d(float d). 这里需要指出的是对于并列的分程序其符号表不会同时存在。 (2) 单表结构 单表结构的思想是,将所有分程序定义的标识作符放在一张符号表中,为了实现分程序逻辑中标识符的作用域规则和可视性要求。将表和操作作适当的修改: a) 增加一个域来登记符号所属分程序的层次 b) 编译程序为源程序建立一个当前层数的计数器,每当进入一个分程序后计数器加1,当退出一个分程序时,计数器减1。 c)退出分程序时,需将所有该层的登记清除。 第五章 符号表 在编译程序的工作过程中,经常需要收集和记录源程序中的一些信息,这些信息往往保存在称为符号表的表中,根据不同的需要可建立如常数表,标识符表各种用途的符号表等。由于每使用一个标识符就需要查表,在整个编译过程中编译程序对这些表格的操作是很频繁的。因此,如何提高填查表的效率直接影响到编译程序的工作效率。 编译程序使用的数据结构从使用的目的来看,可分为查找型数据结构和分配型数据结构。查找型数据结构在编译程序中用于构造不同的信息表,保存源程序中不同实体的属性信息。这种结构的特点是每个实体的项只创建一次,但可以查询多次。因此,查询效率很重要。分配型数据结构主要用于处理嵌套结构的程序。其特点是分配给实体的内存地址对实体用户是可知的。因此,不会对其进行查询操作,但分配和回收的速度及内存的使用效率却是十分重要的。这里结合查找型数据结构重点讨论符号表。 5.1 分配型数据结构 5.1.1 栈 栈是一种先进后出,后进先出的数据结构;访问栈一般访问的是栈顶元素。栈在编译程序中也起着重要的作用,如递归过程(或函数)中说明的动态的局部变量(非静态变量),每进入一次如递归过程(或函数)就需分配相应的一块存储单元,而这种存储单元的分配却符合栈这种先进后出,后进先出特性。 例:设有PASCAL程序 program calc(); var a,b,sum:integer; procedure add(var x,y:integer); begin sum:=x+y; …… end; begin add(3,5); write(sum); end. 则编译语句 sum:=x+y 时过程add的符号和主程序calc的符号都在符号表中,当过程add编译后其符号没有意义,可以从符号表中退去,如图显示。 为了方便地入栈和退栈,把原来的栈顶元素的地址也放入符号表。如图: 如果一个层次的符号结构看作一个记录的话,有分配符号表和回收符号表的动作: 分配时动作: (1) TOP:=TOP+1;/*分配存放原记录底的单元*/ (2) TOP*:=RB; /*将原记录底放入栈中*/ (3) RB:=TOP; /*RB指向新记录的底*/ (4) TOP:=TOP+n; /*将栈指针指向分配后的栈顶*/ 回收时动作: (1) TOP:=RB-1;/*恢复栈顶*/ (2) RB:=RB*; /*将保存的原记录底取出*/ 分配和收回示意图如下: 5.1.2 堆 堆是一种非线性结构,它允许随机分配和回收实体。分配请求返回的是指向所分配区域的指针,删除(回收)请求需提供指向回收区域的指针。堆不提供任何访问被分配实体的方式,它假设被分配实体的用户保留了指向分配区域的指针。 例:执行以下C程序后堆的状态如图所示: int * ptr1,* ptr2; float * ptr3; ptr1=(int *)calloc(3,sizeof(int)); ptr2=(int *)calloc(2,sizeof(int)); ptr3=(float *)calloc(3,sizeof(float)); free(ptr2); 3个内存区在调用calloc后被分配出去,指针ptr1,ptr2,ptr3分别指向这些区域。free释
您可能关注的文档
最近下载
- 四级检验工理论1.docx VIP
- 附件:江苏省建设工程监理现场用(第七版).docx VIP
- 钳工中级班练习(2021-10-27).docx VIP
- DB13_T1418-2011_高温闷棚土壤消毒技术规程_河北省.docx VIP
- 《牛的解剖》课件.ppt VIP
- 新收入准则下建筑业的全流程账务处理.pdf VIP
- DB11 971-2013 重点建设工程施工现场治安防范系统规范.pdf VIP
- 钳工中级班练习(2021-11-1).docx VIP
- 《医疗器械经营质量管理基本要求》DB14T 3291-2025.pdf VIP
- 2024年中考第三次模拟考试题:道德与法治(陕西卷)(解析版).docx VIP
原创力文档


文档评论(0)