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

时间:2018-11-27 11:18:53

标签: c++ parsing compiler-construction preprocessor

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

1 个答案:

答案 0 :(得分:2)

取自the C Preprocessor docs

  

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

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

This page关于魔术如何发生的更多细节。

  

cpp_token结构包含line和col成员。词法分析器用令牌的第一个字符的行和列填充这些内容。因此,但可能出乎意料的是,宏扩展替换列表中的令牌在#define指令中携带了令牌的位置,因为cpplib通过返回指向其替换列表中令牌的指针来扩展宏。

     

[...]因此,此变量唯一枚举翻译单元中的每一行。通过一些简单的基础结构,可以直接将其映射到原始源文件和行号对

Here是C ++ 14(?)标准草案的副本。预处理语法在附录A.14中。我不确定是否要使用其他语言。按照[lex.phases](第2.2节),C ++编译器的行为就像在主翻译/解析发生之前进行预处理一样。