4

在 c# 等前向引用语言中,编译器如何处理这个问题?编译器的操作步骤是什么?

4

3 回答 3

3

是否允许前向引用的主要区别在于使用单遍编译器或多遍编译器。当然,要处理前向引用,您必须在生成正在编译的源代码的完整抽象语法树之后检查符号定义并进行类型检查。

所以没有问题,当你第一次找到一个前向引用时,你只是依赖它稍后会被定义(你可以在符号表中将它标记为待处理)然后当你找到实际定义时,你会在符号表中细化符号对象。

在您可以对其进行类型检查或检查某些符号是否仍在等待处理之后(因此没有真正的定义,并且您可以引发语义错误)..

于 2009-10-31T04:26:48.697 回答
1

它通过执行两遍编译来做到这一点。第一遍解析代码并收集所有使用的标识符。第二遍解析所有标识符。

在像 Pascal 这样具有单遍编译器的语言中,只能使用向后引用,因为在解析标识符之前必须知道标识符的类型。

于 2009-10-31T04:23:23.557 回答
0

我认为与 C++ 处理它的方式完全相同,唯一的区别是:语法足够简单,编译器可以构造解析树,而无需您告诉您尚未声明的符号所指的是哪种语法对象。

于 2009-10-31T03:41:48.680 回答