0

我正在开发一个类似 C 的编译器,我想知道编译器如何与系统包含一起工作。

编译器读取整个代码,并将找到的所有包含存储在一个列表中并解析包含,在完成读取当前代码之后?

// file main.c
#include <stdio.h> // store in one list

// continue the parse ...
int main()
{
    return 0;
}
// now, read the includes
// after finish the includes parse, gen code of sources

// just a sample
// file stdio.h
#include <types.h> // store in list
#include <bios.h>  // store in list

void printf(...)
{
}

void scanf(...)
{
}

顺便说一句,我开发了一个系统(仅测试)来读取包含并停止解析,读取包含......(这是一个令人作呕的代码,但是,工作......)(示例链接)-> https: //gist.github.com/4399601

顺便说一句,阅读包含...并使用包含文件的最佳方法是什么?

4

4 回答 4

5

#include,#define等由称为预处理器#ifdef的单独通道处理。它用包含的文件替换行。然后将生成的临时源文本馈送到后面的通道,如分器和解析器#include

于 2012-12-28T17:11:13.480 回答
1

C 中以 # 开头的任何行都由预处理器处理,而不是编译器。预处理器生成一个文件,然后编译器编译该文件。该文件的内容取决于开发人员和 SDK 定义的任何内容。

于 2012-12-28T17:09:06.603 回答
0

如果我从头开始编写编译器,我首先会考虑处理包含是否是该语言的必要部分 - 如果是,您是否必须编写它,或者您是否可以使用已经存在的编译器(例如 cpp gcc 的一部分)。毕竟,编译器的“有趣”部分是代码的真正编译,而不是读取文件并通过宏扩展将字符串替换为其他字符串 [虽然这当然也很有趣 - 但你可以编写一次你有一个可以工作的编译器!]。

包含文件的棘手部分不是包含本身(相当简单、递归、函数),而是#define/#ifdef/#if/#undef 的解析,更重要的是,用它替换东西。

玩得开心!

于 2012-12-28T17:32:50.603 回答
0

任何以#开头的都是预处理器指令。在编译时会替换相应的代码。编译的第一阶段是预处理器编译。

然后稍后将预处理器(.i 文件)的输出提供给编译的后期阶段。

编译的后期阶段包括 LEXICAL ANALYZER、PARSER、OPTIMIZER 和 CODE GENERATOR..

于 2012-12-28T17:17:45.840 回答