Java - 抽象语法树

时间:2012-03-05 10:27:35

标签: java parsing grammar abstract-syntax-tree

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

我已经发现ANTLR有一个Java 6语法,但似乎它只生成解析树,而不是语法树。我还阅读了有关Java编译器API的文章 - 但是所有提到的资源都是过度设计并且文档记录很差(如果真的生成了AST,我还没发现)。

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

由于

3 个答案:

答案 0 :(得分:6)

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

您可以在project's grammar repository中找到可用的Java 6语法。 JavaCC有点老了,很少更新,但很容易入手,面向Java,并生成AST(搜索JJTree)。它有点,嗯......第一眼就看到了奇怪的,但你可以习惯它。

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

答案 1 :(得分:4)

我们的DMS Software Reengineering Toolkit及其Java front end可以提供AST(example at SO)。

你在“语义需要”(AST)和“语法意外”(“具体”或“解析”树)之间划分的区别很有意思。在某处,需要额外的努力来删除CST信息以获得AST。

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

这是DMS采用的方法。你写了语法。 DMS使用这些想法解析并构建AST。您无需执行其他工作/语义操作。

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

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

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

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

在过去的20年里,我一直听到If I just had a parser...。我的经验(以及我建立DMS的原因)是远远不够,AST是不够的。

而且我认为DMS提供的(远远超出)“仅仅解析”使它远离“JavaCC和ANTLR”。我不相信它们是“目前最好的工具”,除非你在“免费”而不是“完成工作”上进行优化。 (如果你想要一个更接近标记的免费工具,可以考虑使用Eclipse的Java解析机制。至少它有AFAIK,符号表查找)。

答案 2 :(得分:4)

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