在解析时动态收集类定义

时间:2014-12-27 23:45:34

标签: c++ parsing compiler-construction compilation bison

目前,我正在开发一个简单的编译器项目。

假设具有以下语法:

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后来不会打扰编译器。

关于如何实现这一目标的任何建议?

谢谢你的时间。

2 个答案:

答案 0 :(得分:1)

您需要采用多遍方法:

首先遍历AST一次以构建表映射类名到表定义的表,而不执行任何其他需要在表上执行查找的内容。然后再次使用已经构建的表,并且在遇到变量定义时,您将能够循环所需的任何类。

答案 1 :(得分:1)

一种方法可能是,当在变量声明中使用类foo并且它尚不存在时,立即创建类foo,但添加一个标志(类似“未定义”)到类定义。当稍后实际定义类时,更新符号表中的类定义并删除“未定义”标志。

在编译结束时,在符号表中查看仍然标记为“未定义”的任何类,然后报告错误。记录第一次使用该类的行号以进行错误报告可能很有用。

这现在可以使用,但是稍后当你想要检查一个类中的正确成员访问时,如果没有完整的类定义将会很棘手。你可以做一个类似的事情,你推迟成员访问的解析,直到你有定义,但总体而言,我认为这将比sepp2k建议的多次传递更难。