目前,我正在开发一个简单的编译器项目。
假设具有以下语法:
file_input : file_item*
;
file_item : class_def
| variable_decl
;
class_def : 'class' NAME scope
;
variable_decl : 'dim' NAME 'as' NAME
;
现在,在构建我们的symbol table
时,如果我们在类定义之前声明了一个变量,我们将会出现语义错误,因为它无法找到symbol table
中所需的类
foo
的变量并定义类foo
后来不会打扰编译器。
关于如何实现这一目标的任何建议?
谢谢你的时间。答案 0 :(得分:1)
您需要采用多遍方法:
首先遍历AST一次以构建表映射类名到表定义的表,而不执行任何其他需要在表上执行查找的内容。然后再次使用已经构建的表,并且在遇到变量定义时,您将能够循环所需的任何类。
答案 1 :(得分:1)
一种方法可能是,当在变量声明中使用类foo
并且它尚不存在时,立即创建类foo
,但添加一个标志(类似“未定义”)到类定义。当稍后实际定义类时,更新符号表中的类定义并删除“未定义”标志。
在编译结束时,在符号表中查看仍然标记为“未定义”的任何类,然后报告错误。记录第一次使用该类的行号以进行错误报告可能很有用。
这现在可以使用,但是稍后当你想要检查一个类中的正确成员访问时,如果没有完整的类定义将会很棘手。你可以做一个类似的事情,你推迟成员访问的解析,直到你有定义,但总体而言,我认为这将比sepp2k建议的多次传递更难。