7.4符号表.符号表的作用和地位.符号的主要属性及作用.符号表的组织符号表的作用和地位-----语义检查的依据目标代码生成阶段地址分配的依据在编译程序中符号表用来存放语言程序中出现的有关标识符的属性信息,符号表中所登记的信息在编译的不同阶段都要用到。在语义分析中,符号表所登记的内容将用于语义检查(如检查一个名字的使用和原先的说明是否一致)和产生中间代码。在目标代码生成阶段,当对符号名进行地址分配时,符号表是地址分配的依据。对一个多遍扫描的编译程序,不同遍所用的符号表也往往各有不同。因为每遍所关心的信息各有差异。符号属性(信息)几种通常都是需要的。1符号名2符号的类型3符号的存储类别4符号的作用域及可视性5符号变量的存储分配信息6符号的其它属性(1)数组内情向量(2)记录结构型的成员信息(3)函数及过程的形参对符号表的操作•创建符号表在编译开始时或进入一个分程序•插入表项在遇到新的标识符声明时进行•查询表项在引用声明过的标识符时进行•修改表项在获得新的语义值信息时进行•删除一个或一组无用的项•释放符号表的空间在编译结束前或退出一个分程序符号表的组织总体组织和表项属性信息组织第一种:把属性种类完全相同的那些符号组织在一起,构造出多个符号表,常数表、变量名表、过程名表,标号表第二种:把所有语言中的符号都组织在一张符号表中。组成一张包括了所有属性的庞大的符号表符号表项的排列符号表作为一个多元组,表中元组的排列组织是构造符号表的重要成分。在编译程序的整个工作过程中,符号表被频繁地用来建立表项,查找表项,填充和引用表项的属性。因此表项的排列组织对该系统运行的效率起着十分重要的作用。在编译程序中,符号表项的组织传统上采用三种构造方法。即线性法,二分法及散列法。关键字域的组织符号表的关键字域(段)就是符号名称等长关键字域(段)符号表不等长关键字段符号表---采用关键字池的索引结构。作用域检查作用域和可见性基本作用域规则(lexicalrule)inta;voidBinky(inta){inta;a=2;...}作用域检查实现:1每个作用域一个独立的符号表,这些符号表组织成作用域栈2对所有作用域的全局符号表,每个作用域有一个作用域号(1)programsort(input,output)(2)vara:array[0..10]ofinteger;(3)x:integer;(4)procedurereadarray;(5)vari:integer;(6)begin...a...end{readarray};(7)procedureexchange(i,j:integer);(8)begin(9)x:=a[i];a[i:=a[j];a[j]:=x...