Compiler construction 如何用C编写编译器?

Compiler construction 如何用C编写编译器?,compiler-construction,Compiler Construction,我正在用C语言编写一个编译器,我已经阅读了所有关于编译器的文章。但我发现它真的很难实现,我不知道从哪里开始。即使是在lexer部分,也希望知道一个基于代码编写的逐步方法,以便用C编写编译器 你建议我下一步做什么?大多数人使用专门的解析器和lexer生成工具,如ANTLR或Yacc/Bison with Lex。你可以看看 听上去,你需要找出你想要编译的语言:你想要一个C语言的子集,或者一个像Scheme这样易于解析的语言,或者仅仅是一个算术表达式语言 选择/设计一种语言,用它编写两个非常小的程序

我正在用C语言编写一个编译器,我已经阅读了所有关于编译器的文章。但我发现它真的很难实现,我不知道从哪里开始。即使是在lexer部分,也希望知道一个基于代码编写的逐步方法,以便用C编写编译器


你建议我下一步做什么?

大多数人使用专门的解析器和lexer生成工具,如ANTLR或Yacc/Bison with Lex。

你可以看看

听上去,你需要找出你想要编译的语言:你想要一个C语言的子集,或者一个像Scheme这样易于解析的语言,或者仅仅是一个算术表达式语言

选择/设计一种语言,用它编写两个非常小的程序,为其中的一部分编写一个lexer/解析器,然后返回以使部分工作(可能解释为开始-只是为了让您可以看到它运行),然后迭代看起来有趣的块,构建完整的语言

根据提供的额外详细信息进行编辑


“我想做一个c的超集, 喜欢实施各种优势 使用python,但保持简单 作为“c”

我不确定我是否会用手写的方式来完成这一切,但如果我这样做了

我会用混合语言编写一些程序,我希望最终得到这些程序:因此,如果您希望C语言具有类似Python的列表理解,那么也许

void main()
{
    int[] x = {1,2,3,4,5};
    int[] y = {i*i for i in x where i % 2 == 0};
    for (int i in y) { printf("%d", i); }
}
[C样式数组,包括上面暗示的计数,作为读者练习:-)!]

然后让一个绝对最小的C程序工作,hello world,甚至只是静态地添加一些数字(如果是hello world,我甚至可以从特殊的printf大小写开始,这样我就不必解析stdio.h-如果你正朝着C-Python的混合体前进,你可能最终会保留它)。一旦你能做到

void main() 
{
    int x = 0; 
    int y; 
    y = 5; 
    x + y;
}
您可以开始增加复杂性:任意函数定义和调用、更多运算符、返回值、数组、数据结构、常量、指针等等。。。逐步建立最简单的示例程序

从C子集开始的好处是,你有很多C编译器,你可以从中寻找想法,这样你就可以开始了。例如,当你遇到添加python风格片段的困难时,你已经有了坚实的基础


这是在漫长的道路上滑过许多细节。祝你好运。

我想编写自己的词法分析器和语法分析器。。!!不要使用任何工具!!至少ANTLR产生或多或少可读的代码。查看生成的lexer可能会给你关于如何构建自己的lexer的好主意。没有工具吗?我猜你将直接在内存中手工输入字节,而不是使用任何类型的“编译器”来构建这个编译器。我想创建一个c的超集,就像实现python的各种优点一样,但保持它与c一样简单。我真的很喜欢你的最后一段,并且想以这种方式开发编译器,你能描述一下关于这种方法的更多信息吗?那么,你想用基本的Meccano集合中的片段建造一架更大更好的巨型喷气式飞机吗?是的!!所以你们可以理解我的问题,所以请帮我解决“我发现它真的很难实现”——这是因为它很难实现。比起在公园里散步,它更接近于跑马拉松——即使经过多年的训练和天赋,这仍然是一项艰苦的工作。