上下文语义的合法性检查的依据
在语义分析中,符号表所登记的内容将用于语义检查(如检查 一个名字的使用和原先的说明是否一致)和产生中间代码。通 过符号表中属性记录可进行相应上下文的语义检查。 例如,在一个C语言程序中出现 … int i [3][5]; //定义整型数组i … float i[4][2]; //定义实型数组i,重定义冲突 … int i [3][5]; //定义整型数组i,重定义冲突 … 编译过程首先在符号表中记录了标识符i的属性是3×5个整型元 素的数组,而后在分析第二、第三这两个定义说明时编译系统 可通过符号表检查出标识符i的二次重定义冲突错误。本例还可 以看到不论在后二句中i的其它属性与前一句是否完全相同,只 要标识符名重定义,就将产生重定义冲突的语义错误。
9.1符号表的作用和地位 符号表的作用和地位 9.2符号的主要属性及作用 符号的主要属性及作用 9.3符号表的组织 符号表的组织
9.1 符号表的作用和地位
收集符号属性 上下文语义的合法性检查的依据 作为目标代码生成阶段地址分配的依据
收集符号属性
编译程序扫描说明部分,收集有关标识符的属性,并在符号表 中建立符号的相应属性信息。 例如,编译程序分析到下述两个说明语句 int A; float B[5]; 则在符号表中收集到关于符号A的属性是一个整型变量,关于 符号B的属性是具有5个浮点型元素的一维数组。
9.2 符号的主要属性及作用
符号属性
1 符号名 2 符号的类型 3 符号的存储类别 4 符号的作用域及可视性 5 符号变量的存储分配信息 6 符型的成员信息 (3) 函数及过程的形参
① 符号名 符号表中设置一个符号名域,存放该标识符,该域通 常就是符号表的关键字域。
作为目标代码生成阶段地址分配的依据