我目前正在寻找一个Java6/7解析器,它可以生成一些(可能是标准化的)形式的抽象语法树。
我已经发现ANTLR有一种Java6语法,但它似乎只生成解析树,而不生成语法树。我也读过关于Java Compiler API的文章--但是所有提到的源码都是过度设计的,而且文档也很差(如果它真的生成了AST,我还没有发现)。
你知道有什么好的解析器库吗,尽可能标准化的输出?
谢谢
发布于 2012-03-05 19:20:49
基本上,JavaCC和ANTLR是目前最好的工具。
您可以在project's grammar repository中找到可用的Java6语法。JavaCC有点过时,很少更新,但很容易上手,它是面向Java的,并生成JJTree(搜索Java)。有点,嗯.乍一看很奇怪,但你会习惯的。
这两个工具都有很好的集成开发环境支持(例如,Eclipse插件),但我认为(根据您的描述)您需要的是JavaCC。试试看。
发布于 2012-03-05 23:13:31
我们的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以进行更改,因此您可能需要使用您的语言(例如Java)的表面语法来匹配/修补AST的任意块。最后,您可能希望从AST重新生成源代码作为合法的、可编译的文本。
这些都不是容易构建的机制。我们认为我们是称职的工程师;在过去的5年里,我们断断续续地花了几个月的时间才弄清楚Java语法(1.3到6和7)。我们花了大约一年的时间来构建Java的符号表机制;如何解析符号比你想象的要复杂得多;去阅读语言标准吧。
DMS为许多语言提供了所有这些开箱即用的功能,包括Java。对于那些支持较少的语言,它具有现成的解析、漂亮的打印、树转换和属性计算。
我听说,在过去的20年里,。我的经验(也是我构建DMS的原因)是,从长远来看,AST是不够的。
我认为DMS所提供的(远远)超出了“纯粹的解析”,这使得它与"JavaCC和ANTLR“相去甚远。我不相信它们是“目前最好的工具”,除非你是在优化“免费”而不是“完成工作”。(如果您想要一个更接近实际的免费工具,请考虑使用Eclipse的Java解析机制。至少有,AFAIK,符号表查找)。
发布于 2013-08-22 18:27:00
我知道两个用来创建和操作Java AST的开源项目:
https://stackoverflow.com/questions/9565073
复制相似问题