Java抽象语法树

Java抽象语法树,java,parsing,grammar,abstract-syntax-tree,Java,Parsing,Grammar,Abstract Syntax Tree,我目前正在寻找一个Java6/7解析器,它可以生成一些(可能是标准化的)形式的抽象语法树 我已经发现ANTLR有一个Java6语法,但它似乎只生成解析树,而不生成语法树。我也读过关于Java编译器API的书,但是所有提到的资源都表明,它设计过度,文档记录不足(我还没有发现,它是否真的生成了AST) 你知道有什么好的解析器库,有尽可能标准化的输出吗 基本上谢谢你,ANTLR是目前最好的工具 您可以在中找到一个可用的Java6语法。JavaCC有点陈旧,很少更新,但很容易开始,面向Java,并生成A

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

我已经发现ANTLR有一个Java6语法,但它似乎只生成解析树,而不生成语法树。我也读过关于Java编译器API的书,但是所有提到的资源都表明,它设计过度,文档记录不足(我还没有发现,它是否真的生成了AST)

你知道有什么好的解析器库,有尽可能标准化的输出吗

基本上谢谢你,ANTLR是目前最好的工具

您可以在中找到一个可用的Java6语法。JavaCC有点陈旧,很少更新,但很容易开始,面向Java,并生成AST(搜索JJTree)。有点,嗯。。。乍一看很奇怪,但你会习惯的

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

我们的its可以提供AST()

您在“语义所需”(AST)和“语法意外”(“具体”或“解析”树)之间所作的区分很有趣。在某些地方,删除CST信息以获得AST需要额外的努力

您可以通过手工将AST构造编码为规则上的语义操作来实现这一点。这需要努力,而且可能会给你一个很好的答案。但是,通过观察文字标记不需要保留在树中,一元生产链是不必要的(一元生产引入语义的情况除外),并且列表可以自动形成,这个过程可以完全自动化。(您可以在此处阅读更多信息:)

这是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,符号表查找)。< /P> < P>我知道两个开源项目来创建和操作java AST:< /P>

ANTLR确实生成了一个抽象语法树。此外,你的想法有什么不同?我知道ANTLR生成AST,但语法没有:-)。由于解析树包含冗余元素(没有任何语义值),并且按照解析下推自动机创建的顺序包含元素,因此difference是在结构上的。AST被转换为捕获程序的含义-因此它不包含辅助程序非终端符号,并且节点具有语义意义…我想知道是否有标志可以告诉ANTLR添加您认为对AST很重要的位。它们就在那里。手动添加它们并不困难,但语法非常庞大,因此需要预先提供一些完整且经过测试的解决方案:-);我看不出有什么不同。我承认我已经很久没有使用JavaCC了,所以事情可能已经改变了。如果您只需要一个简单的AST,这是很有用的。任何使用任何(oo/过程)语言进行严肃工作的人都不能仅使用AST来完成严肃工作。看看我的答案。DMS看起来不错,但它的哪一部分是免费的还是开放的?DMS是一种商业产品。它一天比一天大:-}