在编译程序工作的过程中
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
构造符号表的算法
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
Hale Waihona Puke Baidu
6.3 非分程序结构语言符号表的建立
我们以FORTRAN语言为例,介绍其符号表的构造. FORTRAN是块结构语言.FORTRAN程序由一或多个 相对独立的程序段组成,其中有唯一的主程序段,其余为 子程序段(FUNTION,SUBROUTINE,BLOCK DATA). 程序段间的信息传递是由形实结合及公共数据区实现 的.因此,程序段名及公共区名是全局量,而各段中定义 的变量均是局部量. FORTRAN语言的编译一般是把每个段视为独立程序 单元进行的.为各段产生相应的代码,再连接装配成一完 整的目标程序.
PROCEDURE B1; VAR A,B,C,D:REAL; PROCEDURE B2; LABEL L1; VAR E,F:REAL; BEGIN … END; PROCEDURE B3; LABEL L2,L3; VAR G,H:REAL; FUNTION B4(…); VAR A:INTEGER; BEGIN … END; BEGIN … END; BEGIN … END.
查填表方案
1.
2.
为了表征一PASCAL程序中各个分程序的嵌套层次关 系,我们可将分程序按其开始符号出现的顺序编号,在 扫描源程序时亦可按这一顺序进行处理.方法是 当在一分程序首部某说明中扫描到一个标识符时,以 此标识符查相应于本层分程序的符号表,若表中已有 此项,则它被重复说明,出错;否则,在表中新登记一 项,将该符号及其相关信息填入. 在分程序执行语句中遇一标识符时,首先查本层表, 若找不到,则查直接外层的符号表,如此等等,若在某 层查到,则可使用相关信息;若遍查所有外层均未找 到,则无定义,出错.
因此,当一程序段编译完毕,该段的局部量已完成使命, 可从表中删除,但全局量仍需保留. 我们可为其建立两个表:全局符号表及局部符号表.其中 局部表是可重复使用的; 较灵活的方法是,将表数据区从两头使用,用指针 AVAIL1及AVAIL2分别指向局部名表空白区和全局名 表空白区.用法见P268图6-6 需指出,有时为实现程序全局优化,局部名表要保留到优 化结束才释放.
符号表组织方式
为实现上述方案,应这样组织符号表: 1. 分层组织符号表的登记项,使各分程序的符号 表登记项连续存放,而不被内层分程序的符号 表分割; 2. 建立一个“分程序表”,用来记录各层分程序 符号表的有关信息.该表有三个域:
①OUTERN 指明该分程序的直接外层分程序的编号; ②ECOUNT 记录该分程序在符号表登记项个数; ③POINTER 指向该分程序在符号表中的起始位置;
6.2 分程序结构语言符号表的建立
分程序结构语言 用其所写的程序单元(program unit) 中,可以再包含嵌套的程序单元,且其中每个程序单元均 可定义属于自己的一组局部变量.如PASCAL中的过程 说明,C中花用括{}号括起来的分程序或复合语句等. 程序单元的嵌套导致了变量作用域的嵌套,故把允许名 字作用域嵌套的语言称为具有~的语言. PASCAL是典 型的~之一. 虽然C不是~的语言,但其函数定义中的函数体可以是 一个嵌套的分程序,因而也涉及到各个局部变量的作用 域. 对于嵌套的作用域,同名变量在不同处代表了不同的实 体,因此,需采用分层建立和处理符号表的方式.
PASCAL语言符号表的构造
在PASCAL程序中,标识符的作用域是包含说明 (定义)该标识符的最小分程序.即: ①若一标识符在某分程序首部已作说明,则它在 整个分程序内均有定义,除非它在某内层分程 序被再次定义.即它的作用域是整个分程序,是 本层分程序及内层分程序的全局量; ②程序中的标号局限于定义该标号的最小分程序; ③我们可将PASCAL的每个过程视为分程序,其参 数总是局限于相应的过程体内.
6.1 符号表的组织
符号表的组织涉及数据结构方面知识(略) 对符号表的访问常见操作有: (1)判定一给定的名字是否在表中; (2)在表中填入一个新名字; (3)访问与给定名字相关的信息; (4)为给定的名字填入或更新其某些信息; (5)从表中删除一个或一组名字 须指出,在很多程序设计语言中,对名字的作用域有相应 的规定,即同一名字的标识符,在不同的作用域里标识了 不同的对象,且占用了不同的存储空间. 因此,在组织符号表时,应能反映各个标识符的作用域.
1 2 3 4
OU TER N 0
1 1 3
EC OU NT 4
3 4 1
POI NTE R
F E L1 A H G L3 L2 D C B A
在前图中,各分程序符号表是按B2,B4,B3,B1的顺序 (即各 分程序的END出现顺序)排列的. 为使各分程序的符号表登记项连续地排列,利用嵌套结构的 特点,可使用一栈存放临时符号表. 当遇到一分程序的END时,它的所有符号已出现在栈顶,可将 其移至正式表中. 我们可将表本身的空白区用作栈,并用整型变量TOPENT及 LASENT指明临时栈的栈顶及符号表的当前最末项. 设符号表区可容纳n个登记项S[1~n],其中 S[n],S[n-1],… 用作栈;B[1~m]为分程序表.用CURRBL,LASTBL指明当前 正在处理的分程序编号及已处理完的最高层分程序的编号.