文档详情

编译原理课件 第8章 符号表与错误处理.ppt

发布:2017-12-31约2.69千字共18页下载文档
文本预览下载声明
* * 第8章 符号表与错误处理 8.1 符号表 8.1.1 符号表的作用 编译过程中需不断收集、记录、查证和使用源程序中的一些名字的类型和特征等相关信息。为方便起见,让编译程序在其工作过程中建立并保存一批表格,如常数表、变量名表、数组内情向量表、过程或子程序名表及标号表等,这些表格统称为符号表或名字表。 符号表中的每一项包括两部分:名字、与名字有关的信息,这些信息全面反映各个语法符号的属性及它们在编译过程中的特征,如名字的种属、名字的类型、特征(定义性还是使用性出现等)、给此名字分配的存储单元地址及与此名字语义有关的其它信息等。 根据编译程序阶段的不同划分,名字表中的各种信息将在编译过程中的适当时候填入。对于词法分析阶段就建立符号表的编译程序,当扫描源程序识别出一个单词时,就以此名字查找符号表。若表中无此名的登记项,则将此名字填入符号表中。 语义分析时,符号表中的信息可用于语义检查;代码优化时,编译程序利用符号表提供的信息选出恰当的代码进行优化;目标代码生成时,编译程序将依据符号表中的符号名来分配目标地址。可见,几乎在编译程序工作的全过程中,都需要对符号表进行频繁地访问(查表或填表),其耗费的时间在整个编译过程中占有很大的比例。因此,合理地组织符号表并选择好的查表、填表方法是提高编译程序工作效率的有效办法。 对于编译程序所用的符号表,它涉及的基本操作大致可归纳为五类: (1) 判断一个给定的名字是否在表中; (2) 在表中填入新的名字; (3) 对给定名字访问它在表中的有关信息; (4) 对给定名字填入或更新它在表中的某 些信息; (5) 从表中删去一个或一组无用的项。 8.1.2 符号表的组织 ? 符号表有多种组织方式。按处理对象的特点,符号表的组织方式一般可分为直接方式和间接方式。 直接方式是指在符号表中直接填入源程序中定义的标识符及相关信息。 间接方式是指单独设置一个字符串数组来存放所有标识符,并在符号表名字栏中设置两项内容:一是指针,用来指向标识符在数组中的起始位置;二是一整数值,用来表示该标识符的长度。 根据符号表名字栏的组织特点,符号表信息栏的组织方式也分为两类:固定信息内容和仅记录信息存放地址。 如果名字栏中的标识符按种属分类,则因同类标识符其基本特征一致,故可将这些信息一一记录在信息栏中。 如果符号表的名字不分种属,则由于不同种属的标识符其特征不一致,即它们所需存储的信息不一致,因而不易确定一个固定长度的空间来统一安排。这时可在符号表外另设一组存储空间,并在符号表信息栏中放一指针来指向这个存储空间始址。 8.1.3 分程序结构语言的符号表建立(P231) 所谓分程序结构的语言,是指用这种语言编写的分程序中可以再包含嵌套的分程序,并且可以定义属于它自己的一组局部变量。由于分程序的嵌套导致名字作用域的嵌套,故有时也将允许名字作用域嵌套的语言称为具有分程序结构的语言。 典型的分程序结构语言是PASCAL;虽然通常不把C语言视为嵌套分程序结构的语言,但在它的函数定义中,函数体可以是一个嵌套的分程序,因而其中所涉及的各个局部变量的作用域也具有嵌套特征。 对于嵌套作用域,同名变量在不同层次出现可能有不同类型。因此,为使编译程序在语义及其它有关处理上不发生混乱,可采用分层建立和处理符号表的方式。 PASCAL程序中,标识符的作用域是包含说明该标识符的最小分程序,即PASCAL程序中标识符的作用域总是与说明这些标识符的分程序的层次相关联。为表征PASCAL程序中各分程序的嵌套层次关系,可将这些分程序按其开头符号在源程序中出现的先后顺序进行编号。这样从左至右扫描源程序时可按分程序在源程序中自然顺序,对各分程序中的标识符进行处理,具体方法如下: (1)当一个分程序首部某说明中扫描到一标识符时,以此标识符查找相应于本层分程序的符号表,如果符号表中已有此名字的登记项,则表明此标识符已说明,应按语法错误进行处理;否则应在符号表中新登记一项,并将此标识符及有关信息填入。 (2)当在一分程序语句中扫描到一个标识符时,先在该层分程序的符号表中查找此标识符;若查不到,则继续在其外层分程序的符号表中查找。如此下去,一旦找到,则作相应处理;如果查遍所有外层都无法找到,则程序中使用了一个未说明的标识符。 为实现上述查填表, 按如下方式组织符号表: (
显示全部
相似文档