代码之家  ›  专栏  ›  技术社区  ›  Buyuk

解析器如何处理预处理器和条件编译?

  •  1
  • Buyuk  · 技术社区  · 6 年前

    我试图弄清楚解析器如何处理预处理器和条件编译。以C++为例,预处理器指令包含在C++语法规则中,还是独立的语言,在解析之前发生预处理。在这两种情况下,解析器如何在预处理之前找出所有可能分支中的错误并检索有关原始代码布局的信息(例如发生错误的行数)?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Community CDub    4 年前

    the C Preprocessor docs

    因此,在GCC的情况下,解析器知道错误发生在哪里,因为预处理器会告诉它。我不确定这个引用是指预处理令牌还是所有C++令牌。

    This page 还有一些关于魔法是如何发生的细节。

    cpp_令牌结构包含行和列成员。lexer用标记的第一个字符的行和列填充这些字符。因此,但可能出乎意料的是,宏扩展的替换列表中的令牌在#define指令中携带该令牌的位置,因为cpplib通过返回指向替换列表中令牌的指针来扩展宏。

    Here 犹如