抽象语法树

我目前正在寻找一个Java 6/7解析器,它可以生成一些(可能是单独的)窗体抽象语法树。

我已经发现ANTLR有一个Java 6语法,但它似乎只能生成分析树,而不是语法树。 我也读过关于Java编译器API的内容 - 但是提到的所有资源都是过度设计和记录不当的(我没有发现,如果它确实生成了AST)。

你知道任何好的解析器库,尽可能标准化输出吗?

谢谢


基本上JavaCC和ANTLR是目前最好的工具。

您可以在项目的语法存储库中找到可用的Java 6语法。 JavaCC有点旧,很少更新,但容易从Java开始,并生成AST(搜索JJTree)。 这有点,呃......一见钟情,但你可以习惯它。

这两种工具都有很好的IDE支持(例如Eclipse插件),但我认为(根据您的描述)您需要的是JavaCC。 试一试。


我们的DMS软件重新设计工具包及其Java前端可以提供AST(例如SO)。

“语义所需”(AST)和“语法错误”(“混凝土”或“解析”树)之间的区别很有趣。 在某个地方需要额外的努力来放弃CST信息以获得AST。

您可以通过手动编写AST结构作为规则上的语义操作来实现这一点。 这需要付出努力,并且可能会给你一个很好的答案。 但是通过观察文字标记不需要保存在树中,这个过程可以完全自动化,一元生产链是不必要的(除非一元生产引入语义),并且该列表可以自动形成。 (你可以阅读更多关于这里:https://stackoverflow.com/a/5732290/120163)

这是DMS采取的方法。 你写的语法。 DMS使用这些想法来解析和构建AST。 您不需要额外的工作/语义操作。

对于已经为你完成的石稳定语法,没有明显的优势,如果你想要的只是一个AST,那么使用JavaCC或ANTLR就可以工作。 如果语法可以改变,那么使用DMS的方法会更容易。

但是,没有人想要一个AST。 它是漫长系列步骤的第一步,可导致您想象的任何工具。 作为真实工具的实际问题,您几乎可以肯定需要“符号表”和abiliy来确定标识符节点选择哪个符号表条目。 您可能需要控制和数据流分析。 如果你的工具是一个“改变”而不仅仅是一个分析工具,那么你可能需要修改AST以进行修改,为此,你可能需要使用你的语言的表面语法匹配/修补AST的任意块的东西(例如Java)。 最后,您可能希望将AST源代码重新生成合法的可编译文本。

这些并不是简单的机制。 我们认为我们是能干的工程师; 在过去的5年中,我们花费了几个月的时间来获得Java语法(1.3到6和7)。 我们花了大约一年时间为Java构建符号表机器; 符号如何解决比你想象的要复杂得多; 阅读语言标准。

DMS为许多语言提供了所有这些功能,包括Java,开箱即用。 对于那些支持较少的语言,它具有解析,漂亮打印,树形转换和属性评估功能。

过去20年来,我一直在听说如果我只有一个解析器......我的经验(以及我建立DMS的原因)是AST远远不够,远远不够。

我认为DMS提供(远远超出)“仅仅解析”就远远超过了“JavaCC和ANTLR”。 我不认为他们是“目前最好的工具”,除非你正在优化“免费”而不是“完成工作”。 (如果你希望免费的工具更接近标记,可以考虑使用Eclipse的Java解析机制,至少它有AFAIK,符号表查找)。


我知道两个开源项目来创建和操作Java AST:

  • JavaParser类
  • Eclipse JDT
  • 链接地址: http://www.djcxy.com/p/68203.html

    上一篇: abstract syntax tree

    下一篇: F# parsing Abstract Syntax Trees