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

C++ 解析器如何处理预处理器和条件编译?,c++,parsing,compiler-construction,preprocessor,C++,Parsing,Compiler Construction,Preprocessor,我试图弄清楚解析器如何处理预处理器和条件编译。以C++为例,预处理器指令包含在C++语法规则中,还是独立的语言,在解析之前发生预处理。在这两种情况下,解析器如何在预处理之前找出所有可能分支中的错误并检索有关原始代码布局的信息(例如发生错误的行数)?摘自: C预处理器通知C编译器源代码中每个令牌的来源位置 因此,在GCC的情况下,解析器知道错误发生在哪里,因为预处理器会告诉它。我不确定这个引用是指预处理令牌还是所有C++令牌。 还有一些关于魔法是如何发生的细节 cpp_令牌结构包含行和列成员。le

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

摘自:

C预处理器通知C编译器源代码中每个令牌的来源位置

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

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

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

[…]因此,此变量唯一地枚举翻译单元中的每一行。通过一些简单的基础设施,可以直接从这个映射到原始源文件和行号对

是C++14(?)标准草案的副本。预处理语法见附录A.14。我不确定你是否想把它称为一种独立的语言。[Lex.Primes ](第2.2节),C++编译器表现为在主翻译/解析发生之前发生预处理。