Parsing 学习增量编译设计

Parsing 学习增量编译设计,parsing,compilation,incremental-compiler,Parsing,Compilation,Incremental Compiler,有很多关于创建编译器的书籍和文章,这些编译器一次完成所有的编译工作。那么IDE使用的增量编译器/解析器的设计呢?我熟悉第一类编译器,但从未使用过第二类编译器 我试图阅读一些关于EclipseJava开发工具的文章,但它们描述了如何使用完整的基础设施(即API),而不是描述内部设计(即它如何在内部工作) 我的目标是为我自己的编程语言实现增量编译器。你推荐我读哪些书或文章?这本书值得一看:构建灵活的增量编译器后端 引用第10章“结论”: 本文对该系统的设计进行了探讨 增量数据库的后端 编译系统。而不

有很多关于创建编译器的书籍和文章,这些编译器一次完成所有的编译工作。那么IDE使用的增量编译器/解析器的设计呢?我熟悉第一类编译器,但从未使用过第二类编译器

我试图阅读一些关于EclipseJava开发工具的文章,但它们描述了如何使用完整的基础设施(即API),而不是描述内部设计(即它如何在内部工作)


我的目标是为我自己的编程语言实现增量编译器。你推荐我读哪些书或文章?

这本书值得一看:构建灵活的增量编译器后端

引用第10章“结论”:

本文对该系统的设计进行了探讨 增量数据库的后端 编译系统。而不是 构建单个固定增量 编译器,本文提出了一种 灵活的框架来构建这样的系统 系统可根据用户的需要

我想这就是你要找的

编辑:
所以你打算创建一个叫做“交叉编译器”的东西
我开始了新的尝试。直到现在,我还不能提供最终的参考。如果你计划这么大的项目,我相信你是一个经验丰富的程序员。因此,您可能已经知道这些链接


某些编译器的列表,甚至是交叉编译器(翻译器)。不幸的是,有些链接已断开,但“Toba”仍在工作,并有一个指向其源代码的链接。也许这能激励你



好的,它是为,但源代码在SVN存储库中可用,并且它似乎是编译器(翻译程序)的前端。也许这也能启发你。

在这一点上,我不同意传统智慧,因为大多数传统智慧都会对你的目标做出不成文的假设,比如完整的语言设计和极端效率的需要。根据你的问题,我假设以下目标:

  • 学习如何编写自己的语言
  • 玩弄你的语言,直到它看起来优雅
  • 尝试将代码发送到另一种语言或字节码中以供实际执行
您需要构建黑客工具和递归下降解析器

以下是您可能希望使用基于文本的处理器为线束构建的内容

  • 更改代码片段(现在是“0700时将走廊灯设置为全开”)
  • 编译片段
  • 更改代码文件(现在为“tests.l”)
  • 从文件编译
  • 切换Lexer输出(现在打开)
  • 切换发射器输出(现在启用)
  • 切换在家用硬件上运行(现在关闭)

    您的命令,陛下

  • 您可能希望用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的一篇文章:

    这篇文章的重点是第一页。它解释了编辑器中的代码被划分为“合并”到“代码库”(数据库)中的片段。工件通过包含未合并工件的工作队列合并。一段代码可能会被解析并多次返回到工作队列,每次尝试都会有一些失败,直到它成功通过。数据库包含了片段之间的依赖关系,因此当编辑源代码时,可以看到对已编辑片段和其他片段的影响,并且可以重新处理这些片段


    我相信其他系统处理这个问题的方式不同。Java与C/C++存在不同的问题,但也有优势,因此Eclipse可能有不同的设计。

    Markus,感谢您的回复。我希望这是一篇对我有用的文章。如果我理解正确的话,它关注的是设计的后端方面,但我在寻找前端(也可能是中间端)方面,比如解析和AST构造。我自己的语言编译器属于源代码到源代码类,因此其设计的后端方面可能与源代码到字节码编译器中的类似方面有所不同。有没有可能阅读一些关于前端方面的文章?这是我在这里得到的最接近的答案。我还在论文的参考资料部分找到了有趣的链接。因此,我已将此答案标记为“已接受”。再次感谢你!查尔斯,谢谢你的详细答复。对于那些第一次开始从事编译器/语言设计的人来说,这可能是一个很好的建议。但我已经完成了这些步骤。我有一个完整的编程语言设计和一个编译器原型。现在我将重写编译器,使之能够为该语言实现某种IDE。换句话说,我想做“引导步骤”。因此,我对增量解析设计感兴趣(它不同于常规的递归下降或上升解析技术)。这就是为什么我要问这个问题你问这个问题已经一年了,我的处境也差不多。你找到更好的信息了吗?Johannes,很抱歉这么长时间没有回答。很遗憾,我没有听到你的评论。有几种不同的方法