第9章符号表

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

③ 符号的存储类别 大多数语言对变量的存储类别定义采用二种方式。 一种是用关键字指定: 例如在C语言中用Static定义是属于文件的静态存储变量或 属于函数内部的静态存储变量,用regist定义使用寄存器 存储的变量。 另一种方式是根据变量说明在程序中的位置来决定: 例如在C语言中,在函数体外缺省存储类关键字所定义的 变量是外部变量,即程序的公共存储变量,而在函数体内 缺省存储类关键字所定义的变量是内部变量,即属于该函 数所独有的私有存储变量
⑴ 函数的形式参数:影响变量可视性的举例 int a; // 外部定义的整型变量a int func(a,b) float a; // 函数内部定义的局部整型变量a, 屏闭了外部定义的整型变量a int b; { … …a… // 引用的是函数内部定义(此处是形参)的局部整型变量a … }
函数的形式参数可以和该函数外层定义的变量(包括外部变量)重名,这时两个 重名的变量其类型定义可以是完全不同的。
int A;源自文库
float B[5];
则在符号表中收集到关于符号A的属性是一个整型变量,关于符号B 的属性是具有5个浮点型元素的一维数组。
② 上下文语义的合法性检查的依据: 在语义分析中,符号表所登记的内容将用于语义检查(如检查一个
名字的使用和原先的说明是否一致)和产生中间代码。通过符号表 中属性记录可进行相应上下文的语义检查。
⑤ 符号变量的存储分配信息 通常一个编译程序有两类存储区,即静态存储区和动态存储区; ⑴ 静态存储区 该存储区单元经定义分配后成为静态单元,即在整 个语言程序运行过程中是不可改变的。作静态分配的符号变量是 具有整个程序运行过程的生命周期。因此编译程序可以设置一个 固定的空间作为静态存储区。 但由于不同的静态变量具有不同的可视性,编译程序也可以设置 几个不同的固定空间作为静态区。根据变量存储类别及作用域规 则,这类静态存储区通常又可分为公共静态区和若干个局部静态 区。 一个语言程序中的公共变量或称外部变量是被指定分配到该公共 静态存储区中。例Pascal或C语言中的外部量就属于这类共静态存 储区的分配。在公共静态区中的变量具有的生命周期是该程序运 行的全过程,且其作用域亦是整个语言程序(注意:当它被同名 局部量屏蔽时,该变量成为不可视的)。
④ 符号的作用域及可视性
一个符号变量在程序中起作用的范围,称谓它的作用域。一般来说, 定义该符号的位置及存储类关键字决定了该符号的作用域。C语言中 一个外部变量的作用域是整个程序,因此一个外部变量符号的定义在 整个程序中只能出现一次。
一般来说一个变量的作用域就是该变量可以出现的场合,这就是变 量可视性的作用域规则。但是变量可视性不仅仅取决于它的作用域, 还有两种情况影响到一个变量的可视性。
在整个编译期间,对于符号表的操作大致可 归纳为五类:
• 对给定名字,查询名字是否已在表中; • 往表中填入一个新的名字; • 对给定名字,访问它的某些信息; • 对给定名字,填写或更新它的某些信息; • 删除一个或一组无用的项。 上述五个方面只是一些基本的共同操作。
9.2符号的主要属性及作用
符号表的主要属性(信息)
几种通常都是需要的。 1 名字 2 类型 3 存储类别 4 作用域及可视性 5 存储分配信息 6 其它属性 (1) 数组内情向量
(2) 记录结构型的成员信息 (3) 函数及过程的形参
① 符号名 符号表中设置一个符号名域,存放该标识符,该域通 常就是符号表的关键字域。
② 符号的类型 标识符中除过程标识符之外,函数和变量标识符都具有 数据类型(data type)属性。对于函数的数据类型指 的是该函数值的数据类型。基本数据类型有整型、实型、 字符型、逻辑型(布尔型)及位组型等,符号的类型属 性是在该符号的定义时得到。变量符号的类型属性决定 了该变量的数据在存储空间的存储格式,还决定了在该 变量上可以施加的运算操作。
第9章 符号表
9.1符号表的作用和地位 9.2符号的主要属性及作用 9.3符号表的组织 9.4 符号表的管理
9.1符号表的作用和地位
符号表的作用和地位:
① 收集符号属性 ② 上下文语义的合法性检查的依据 ③ 作为目标代码生成阶段地址分配的依据
① 收集符号属性
编译程序扫描说明部分收集有关标识符的属性,并在符号表 中建立符号的相应属性信息。例如,编译程序分析到下述两 个说明语句
③ 作为目标代码生成阶段地址分配的依据
在目标代码生成阶段,当对符号名进行地址分配时, 符号表是地址分配的依据。
一张符号表的的组成:包括两项,即名字栏和信 息栏。
名字栏(NAME)
信息栏 (INFORMATION)
信息栏包含许多子栏和标志位,用来记录相应名
字和种种不同属性,名字栏也称主栏。主栏的 内容称为关键字(key word)。
⑵ 分程序(或复合语句)结构: 影响变量可视性的举例
… {int a; // 第一层头,定义的局部整型变量a
… {char a; // 第二层头,定义的局部字符型变量a
… { // 第三层头
… {float a; // 第四层头,定义的局部实型变量a
… } // 第四层尾 …a… // 引用第二层定义的局部字符型变量a } // 第三层尾 } // 第二层尾 } // 第一层尾 图中第三层所引用的a,既不是第四层的float a;也不是第一层int a;而是 第二层char a;也就可以说从第三层向外,看到的第一个定义a的变量定义即 char a。 为确立符号的作用域和可视性。符号表属性中除了需要符号的存储类别之外还需 要表示该符号在程序结构上被定义的层次。符号表中设置一个表达符号所在层次 的属性域,存放该符号的定义层次。一般来说,若把外部变量视为0层的话,则 函数内部作为第1层,依次向内嵌套定义的分程序分别为2,3,…层。
例如,在一个C语言程序中出现
… int i [3][5]; //定义整型数组i
… float i[4][2]; //定义实型数组i,重定义冲突
… int i [3][5]; //定义整型数组i,重定义冲突
… 编译过程首先在符号表中记录了标识符i的属性是3×5个整型元素的 数组,而后在分析第二、第三这两个定义说明时编译系统可通过符 号表检查出标识符i的二次重定义冲突错误。本例还可以看到不论在 后二句中i的其它属性与前一句是否完全相同,只要标识符名重定义, 就将产生重定义冲突的语义错误。
相关文档
最新文档