编译原理课件19.ppt

编译原理课件19.ppt

ID:51496651

大小:172.50 KB

页数:13页

时间:2020-03-25

编译原理课件19.ppt_第1页
编译原理课件19.ppt_第2页
编译原理课件19.ppt_第3页
编译原理课件19.ppt_第4页
编译原理课件19.ppt_第5页
资源描述:

《编译原理课件19.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、第六章符号表在编译程序工作的过程中,需要不断收集、记录和使用源程序中一些语法符号的类型和特征等相关信息.这些住处一般以表格形式存储于系统中.如常数表、变量名表、数组名表、过程名表、标号表等等,统称为符号表。对于符号表组织、构造和管理方法的好坏会直接影响编译系统的运行效率。6.1符号表的组织符号表的组织涉及数据结构方面知识(略)对符号表的访问常见操作有:(1)判定一给定的名字是否在表中;(2)在表中填入一个新名字;(3)访问与给定名字相关的信息;(4)为给定的名字填入或更新其某些信息;(5)从表中删除一个或一组

2、名字须指出,在很多程序设计语言中,对名字的作用域有相应的规定,即同一名字的标识符,在不同的作用域里标识了不同的对象,且占用了不同的存储空间.因此,在组织符号表时,应能反映各个标识符的作用域.6.2分程序结构语言符号表的建立分程序结构语言用其所写的程序单元(programunit)中,可以再包含嵌套的程序单元,且其中每个程序单元均可定义属于自己的一组局部变量.如PASCAL中的过程说明,C中花用括{}号括起来的分程序或复合语句等.程序单元的嵌套导致了变量作用域的嵌套,故把允许名字作用域嵌套的语言称为具有~的语言

3、.PASCAL是典型的~之一.虽然C不是~的语言,但其函数定义中的函数体可以是一个嵌套的分程序,因而也涉及到各个局部变量的作用域.对于嵌套的作用域,同名变量在不同处代表了不同的实体,因此,需采用分层建立和处理符号表的方式.PASCAL语言符号表的构造在PASCAL程序中,标识符的作用域是包含说明(定义)该标识符的最小分程序.即:①若一标识符在某分程序首部已作说明,则它在整个分程序内均有定义,除非它在某内层分程序被再次定义.即它的作用域是整个分程序,是本层分程序及内层分程序的全局量;②程序中的标号局限于定义该标

4、号的最小分程序;③我们可将PASCAL的每个过程视为分程序,其参数总是局限于相应的过程体内.查填表方案为了表征一PASCAL程序中各个分程序的嵌套层次关系,我们可将分程序按其开始符号出现的顺序编号,在扫描源程序时亦可按这一顺序进行处理.方法是当在一分程序首部某说明中扫描到一个标识符时,以此标识符查相应于本层分程序的符号表,若表中已有此项,则它被重复说明,出错;否则,在表中新登记一项,将该符号及其相关信息填入.在分程序执行语句中遇一标识符时,首先查本层表,若找不到,则查直接外层的符号表,如此等等,若在某层查到,

5、则可使用相关信息;若遍查所有外层均未找到,则无定义,出错.符号表组织方式为实现上述方案,应这样组织符号表:分层组织符号表的登记项,使各分程序的符号表登记项连续存放,而不被内层分程序的符号表分割;建立一个“分程序表”,用来记录各层分程序符号表的有关信息.该表有三个域:①OUTERN指明该分程序的直接外层分程序的编号;②ECOUNT记录该分程序在符号表登记项个数;③POINTER指向该分程序在符号表中的起始位置;PROCEDUREB1;VARA,B,C,D:REAL;PROCEDUREB2;LABELL1;VAR

6、E,F:REAL;BEGIN…END;PROCEDUREB3;LABELL2,L3;VARG,H:REAL;FUNTIONB4(…);VARA:INTEGER;BEGIN…END;BEGIN…END;BEGIN…END.OUTERNECOUNTPOINTER104213314431FEL1AHGL3L2DCBA在前图中,各分程序符号表是按B2,B4,B3,B1的顺序(即各分程序的END出现顺序)排列的.为使各分程序的符号表登记项连续地排列,利用嵌套结构的特点,可使用一栈存放临时符号表.当遇到一分程序的END时

7、,它的所有符号已出现在栈顶,可将其移至正式表中.我们可将表本身的空白区用作栈,并用整型变量TOPENT及LASENT指明临时栈的栈顶及符号表的当前最末项.设符号表区可容纳n个登记项S[1~n],其中S[n],S[n-1],…用作栈;B[1~m]为分程序表.用CURRBL,LASTBL指明当前正在处理的分程序编号及已处理完的最高层分程序的编号.构造符号表的算法1.初始化:CURRBL=0;LASENT=0;LASTBL=0;TOPENT=0;/*注:以上各量在下面的程序中分别简记为CB,LE,LT,TE*/2.

8、(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

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。