c - 实现 C#include 指令的内部处理

标签 c parsing compiler-construction language-implementation

我需要以最简洁的方式为 C 编译器实现 #include 指令的功能。

我只知道如何实现处理的外部部分:获取行首的 '#' 字符以运行仅预处理器循环,我还知道如何收集 "include" 字符串和 <>"" 之间的字符串.

我不知道的是实现内部处理以运行#include 指令的实际效果的最佳方法:扩展库头文件的完整路径(使用 <> )但不扩展使用 "" 的库头文件(它是假设它们在当前目录中可能更清晰、更灵活,因为这也允许正确包含具有完整路径的源文件。

我认为我需要执行的任务是:

  • 作为命令行参数传递给编译器的主 C 文件应该像处理 #include "mainfile.c" 指令一样以统一的方式开始编译。

  • 扩展包含引号的文件的路径("",单引号 '' 是否至少对某些编译器有效?)

  • 将文件放在文件列表中,同时指出我们在哪一行和哪个文件中找到了 #include 指令

  • 在预处理器阶段,看是否是#include指令,尝试无条件打开指定文件,尝试从头开始正确获取所有文件。如果一个文件不存在,不要在预处理器阶段发出错误信号,只有当我们将它们标记为可用时,当我们确定是否应该包含它们时由于 #ifdef#elif ,同时尝试翻译实际C代码。

  • 在处理完代码中的所有 #includes 后,现在处理其余的预处理器代码以及要包含的全套潜在文件。

我认为使用一堆文件会有用,但只有在完成预处理器阶段之后,并且当我们已经翻译了整个代码并添加文件时(将文件索引压入源文件堆栈的 #include 并弹出文件索引源文件的末尾。)

我认为处理代码的最简单方法是检查 #include 指向的所有文件,列出它们,然后只标记为可用,我将实际包括的那些和完全处理,那些满足 #ifdef#elif 条件的,但为此我需要查看整个源文件集中有哪些包含文件。

最佳答案

您通常会在阅读时处理所有预处理器指令。因此,当您看到 #include 时,您会获得文件名、搜索包含路径、打开文件并开始处理它——无需延迟。到达包含文件的末尾后,您将继续处理原始文件。

#if 类似,您读取条件并确定它是真还是假。如果为 false,则开始跳过输入,忽略它,直到找到匹配的 #else#endif。因此,如果那里有 #include,您只需跳过它。

关于c - 实现 C#include 指令的内部处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48753050/

相关文章:

c++ - 柔性/莱克斯 : Regular Expression matches double characters

c - 大型 malloc 上的系统 malloc 与 DLMalloc

javascript - 解析关系数据上的查询 Javascript - "contains"

c++ - Boost Spirit 自动解析器因 double 元组而失败

ios - 将数据发布到服务器以获得响应

gcc - Windows中嵌入式平台的交叉编译器

c++ - 是否存在任何情况下有效的 C 代码无法使用 g++ 正确编译

用于获取 JPEG 图像大小的 C++ 库

c - "undefined reference to ' cblas_ddot '"使用cblas库时

c++ - 使用 boost spirit x3 进行语义检查