2009-10-31 18 views
4

在正向引用语言(如c#)中,编译器如何处理这个问题?编译器的操作步骤是什么?C#的编译器设计 - 正向引用

+0

C还采用前向参考:HTTP:// WWW。 nacs.uci.edu/dcslib/digital_unix/digital-v40d/AQTLTBTE/DOCU_024.HTM – 2009-10-31 03:18:45

+0

您可能想要更改您的问题,因为前向引用和前向声明可以在C++中找到,所以您的问题可能需要比您更一般预期。 – 2009-10-31 03:20:26

回答

3

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

因此,没有任何问题,当您第一次找到一个前向引用时,您只是依赖它将在稍后定义它(您可以将它标记为符号表中的待定),然后当您找到实际定义时,符号表。

后,您可以进行类型检查,或检查,如果一些符号仍然悬而未决(所以没有真正的定义,你可以提出一个语义错误)..

0

完全相同的方式C++处理它,我认为只有区别:语法足够简单,编译器可以构造分析树,而无需告诉您未声明的符号引用了什么样的语法对象。

1

它通过两次编译完成此操作。第一遍解析代码并收集所有使用的标识符。第二遍解析所有标识符。

在使用单通道编译器的语言(如Pascal)中,只能使用向后引用,因为在解析标识符之前必须知道标识符的类型。