Java抽象语法树
我目前正在寻找一个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远远不够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
我认为DMS所提供的(远远)超出了“单纯解析”的范围,使其与“JavaCC和ANTLR”相去甚远。我不相信它们是“目前最好的工具”,除非你是在“免费”而不是“完成任务”上进行优化。(如果你想要一个更接近于标记的自由工具,考虑使用Eclipse的java解析机制。至少它有,AFAIK,符号表查找)。< /P> < P>我知道两个开源项目来创建和操作java AST:< /P>