有很多关于创建编译器的书籍和文章,这些编译器一次完成所有编译工作。那么 IDE 使用的增量编译器/解析器的设计呢?我熟悉第一类编译器,但我从未使用过第二类编译器。
我试图阅读一些关于Eclipse Java开发工具的文章,但它们描述了如何使用完整的基础架构(即API),而不是描述内部设计(即它如何在内部工作)。
我的目标是为我自己的编程语言实现增量编译器。你会推荐我哪些书籍或文章?
值得一看:构建一个灵活的增量编译器后端。
引自第10章"结论":
本文探讨了 增量的后端 编译系统。而不是 构建单个固定增量 编译器,本文提出了一个 构建此类的灵活框架 系统符合用户需求。
我认为这就是你要找的...
编辑:
所以你打算创建一些被称为"交叉编译器"的东西?!
我开始了新的尝试。直到现在,我无法提供最终的参考。如果你计划这么大的项目,我相信你是一个有经验的程序员。因此,您可能已经知道这些链接。
Compilers.net某些编译器的列表,甚至是交叉编译器(转换器)。不幸的是,有一些断开的链接,但"Toba"仍在工作,并且有一个指向其源代码的链接。也许这可以激励你。
clang:LLVM
的C语言家族前端好的,它适用于LVVM,但源代码在SVN存储库中可用,它似乎是编译器(转换器)的前端。也许这也可以激励你。
在这一点上,我不同意传统智慧,因为大多数传统智慧对你的目标做出了不成文的假设,比如完整的语言设计和对极端效率的需求。 从你的问题中,我假设这些目标:
- 了解如何编写自己的语言
- 玩弄你的语言,直到它看起来很优雅
- 尝试将代码发出到另一种语言或字节代码中以进行实际执行。
你想要构建一个黑客工具和一个递归下降解析器。
以下是您可能希望仅使用基于文本的处理器为工具构建的内容。
- 更改代码片段(现在为"AT 0700 将走廊灯设置为全开")
- 编译片段
- 更改代码文件(现在是"tests.l")
- 从文件编译
- 切换词法分析器输出(现在打开)
- 切换发射器输出(现在打开)
-
切换在家用硬件上运行(现已关闭)
您的命令,陛下?
您可能希望用 Python 或其他脚本语言编写代码。 您正在优化游戏速度,而不是执行。 递归下降分析器可能如下所示:
def cmd_at():
if next_token.type == cTIME:
num = next_num()
emit("events.setAlarm(events.DAILY, converttime(" + time[0:1] + ", "
+ time[2:] + ", func_" + num + ");")
match_token(cTIME)
match_token(LOCATION)
...
所以你需要写:
- 黑客的小菜单。
- 一些词法例程,用于为数字、保留字等返回不同的标记。
- 你的语言的一堆逻辑
这种方法旨在加快将语言组合在一起的周期。 完成这种方法后,您可以拿起野牛、测试工具等。
制作自己的语言可以是一个美妙的旅程! 期待学习。 不要指望致富。
我看到有一个公认的答案,但我认为可以在此页面上包含一些其他材料。
我阅读了有关此主题的维基百科文章,它链接到 1997 年的 DDJ 文章:
http://www.drdobbs.com/cpp/codestore-and-incremental-c/184410345?pgno=1
文章的肉是第一页。它解释了编辑器中的代码被分成"合并"到"代码存储"(数据库)中的部分。这些部分通过包含未合并部分的工作队列进行合并。一段代码可能会被解析并多次返回到工作队列,每次尝试都会失败,直到它成功通过。数据库包括片段之间的依赖关系,以便在编辑源代码时可以看到对编辑片段和其他片段的影响,并且可以重新处理这些片段。
我相信其他系统以不同的方式处理这个问题。Java提出了与C/C++不同的问题,但也有优势,所以Eclipse可能有不同的设计。