代码之家  ›  专栏  ›  技术社区  ›  Shawn Mclean

C的编译器设计-前向引用

  •  4
  • Shawn Mclean  · 技术社区  · 15 年前

    在正向引用语言(如C)中,编译器如何处理这种情况?编译器的操作步骤是什么?

    3 回复  |  直到 15 年前
        1
  •  3
  •   Jack    15 年前

    允许或不允许向前引用的主要区别是使用 一次通过编译器 或者是多通的。当然,要处理前向引用,必须检查符号定义并进行类型检查。 生成了正在编译的源的完整抽象语法树。

    所以没问题,当你第一次找到一个正向引用时,你只是依赖于它将在以后被定义(你可以在符号表中将其标记为挂起),然后当你找到实际的定义时,你将在符号表中细化符号对象。

    之后,您可以对其进行类型检查,或者检查某些符号是否仍处于挂起状态(因此没有真正的定义,您可以引发语义错误)。

        2
  •  1
  •   Guffa    15 年前

    它通过两次编译来实现这一点。第一个过程解析代码并收集所有使用的标识符。第二遍解析所有标识符。

    在具有单通道编译器的语言中,如pascal,只有向后引用才能用作标识符的类型,在解析标识符之前必须知道它的类型。

        3
  •  0
  •   stupito    15 年前

    完全一样,C++处理它,我想,只是区别:语法很简单,编译器可以构造解析树,而不需要你告诉你你还未声明的符号所指的是什么样的语法对象。