2.1.3 符号表管理
符号表是记录符号信息的数据结构,它使用按名存取的方式记录与符号相关的所有编译信息。编译器工作时,少不了符号信息的记录和更新。在本书定义的高级语言中,符号存在两种形式:变量和函数。前者是数据的符号化形式,后者是代码的符号化形式。语义分析需要根据符号检测变量使用的合法性,代码生成需要根据符号产生正确的地址,因此,符号信息的准确和完整是进行语义分析和代码生成的前提。见图2-6。
对于变量符号,需要在符号表中记录变量的名称、类型、区分变量的声明和定义的形式,如果变量是局部变量,还需要记录变量在运行时栈帧中的相对位置。例如以下变量声明语句:
extern int var;
该语句声明了一个外部的全局变量,记录变量符号的数据结构除了保存变量的名称“var”之外,还需要记录变量的类型“int”,以及变量是外部变量的声明形式“extern”。
对于函数符号,需要在符号表中记录函数的名称、返回类型、参数列表,以及函数内定义的所有局部变量等。例如下面的函数定义代码:
int sum(int
a,int b)
{
int c;
c=a+b;
return c;
}
符号表应该记录函数的返回类型“int”、函数名“sum”、参数列表“int,int”。函数的局部变量除了显式定义的变量“c”之外,还暗含参数变量“a”和“b”。
由于局部变量的存在,符号表必须考虑代码作用域的变化。函数内的局部变量在函数之外是不可见的,因此在代码分析的过程中,符号表需要根据作用域的变化动态维护变量的可见性。
时间: 2024-11-01 23:06:44