【问题标题】:How parsers handle preprocessors and conditional compilation?解析器如何处理预处理器和条件编译?
【发布时间】:2019-04-29 02:59:38
【问题描述】:

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

【问题讨论】:

标签: c++ parsing compiler-construction preprocessor


【解决方案1】:

取自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++ 编译器的行为就好像在主翻译/解析发生之前发生了预处理。

【讨论】:

    猜你喜欢
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    相关资源
    最近更新 更多