Symbol Table Design
相对于实验课任务来说,扩展语言的功能除了要规划好合适的文法(太简单了功能不全,太齐全了语义的翻译方案没法写),另一个关键是符号表的重新设计。
为了加上多函数定义和函数调用的功能,就必须考虑到变量的作用域问题。一个全局变量和一个局部变量可以同名,显然他们代表不同内存单元。这样,原先那种没有层次关系的符号表结构就不再适合了。为了区别局部变量和全局变量,应该为全局空间和每个函数体建立单独的符号表。
其次,在词法分析阶段填写符号表的方法过时了。词法分析只能识别出一个个Token串。如果遇到两个同名的变量,词法分析对于判断它们是同一个变量的引用还是两个作用域中定义变量显得无能为力。因此,查填符号表的工作应该放在语法制导的语义分析阶段。此时,词法分析的作用仅仅是识别出变量标示符的词类编码,并直接记录它的名字(字符串),而不是记录其在符号表中的入口地址了。而符号表也完全采用按字符串索引的方式建立。多亏了STL中的map类,我可以直接把string作为索引映射到任何类型上。map
一张图能抵过千言万语。对于符号表的层次结构,下面的例子给出了清晰的阐述。
//file: Test_Example.c:
int a;
long b;
int c;
int f(int a, int b)
{
int c;
long arr[10];
}
int r[5][5];
对于上面的变量定义将产生下图所示的符号表层次图:

Labels: Pallyc Project

0 Comments:
Post a Comment
<< Home