解析 Java 源代码

Posted

技术标签:

【中文标题】解析 Java 源代码【英文标题】:Parsing Java Source Code 【发布时间】:2011-07-26 17:09:39 【问题描述】:

我被要求开发一个软件,它应该能够创建输入 Java 源代码的流程图/控制流。所以我开始研究它并得出以下解决方案:

要创建流程图/控制流,我必须识别给定源代码中的控制语句和函数调用现在我有两种识别方法:

    通过编写我自己的语法来解析源代码(我认为这是一个复杂的解决方案)。我正在考虑为此使用 Antlr。 以文本形式读取输入源代码文件并搜索特定模式(可能效率低下)

我在这里吗?或者我错过了一些非常基本和简单的东西?哪种方法会花费更少的时间并有效地完成工作?在这方面的任何其他建议也将受到欢迎。任何其他有效的方法都会有所帮助,因为输入源代码可能跨越多个文件并且可能相当复杂。

我精通 .NET 语言,但这是我的第一个 Java 大项目。我有编译器设计的基本知识,所以写语法对我来说应该不是不可能的。

对不起,如果我不清楚。请要求任何澄清。

【问题讨论】:

听起来是个有趣的项目。您可以使用 Eclipse GMP eclipse.org/modeling/gmp 等框架在图形端节省一些工作如果您要使用基于文本的方法(这可能就足够了,取决于输入的复杂性),您可以使用 Java 注释 @987654322 @ 您不想构建语法,并尝试自己构建它。如果你很好并且有很好的工具,这将花费你一年的时间。有许多 Java 解析器,其中一些具有控制流分析作为选项;使用其中一种,继续你的生活。 我很乐意选择一个答案。 @jmg:嗯,这很难......因为所有方法都不同但同样适用......这使得答案的选择变得主观...... 【参考方案1】:

我会选择 Antlr 并使用现有的 Java 语法:https://github.com/antlr/grammars-v4

【讨论】:

浏览了你提供的链接...下载了.g文件...现在我需要用Antlr打开它吗???【参考方案2】:

所有处理 Java 代码的工具通常首先决定它们是要处理语言 Java 还是 Java 字节码文件。这是一个战略决策,取决于您的用例。我可以为流程图生成进行图像处理。当你决定了这个问题。已经有几个框架或库可以帮助您。对于字节码工程有:ASM、JavaAssist、Soot、BCEL,好像已经死了。 Java语言解析分析有:Polyglot,eclipse编译器,javac。所有这些都包括一个完整的 Java 编译器前端并且是开源的。

我会尽量避免为 Java 编写自己的解析器。我做过一次。 Java 有一个相当复杂的语法,但可以在其他地方找到。真正的工作从名称和类型解析开始。如果要生成涵盖多个方法主体的图形,则两者都需要。

【讨论】:

好吧,我们需要解析源代码...Polygot 似乎是个好主意...但它不是一个复杂的解决方案...假设我们的用例说明输入源代码将是没有错误...另一点是我应该将它包含在我的应用程序中吗??...破解它的源代码并查看发生了什么?/或其他什么?? @Sudh:这一切都归结为一个问题,你需要什么?你说,你可以假设正确的输入。嗯,这是一件好事。但是如果您仍然需要名称和类型解析,例如看看哪些是方法调用的可能目标,然后我会去一个现成的编译器前端。例如。 Polyglot、javac 或 eclipse java 编译器。对于集成问题,您是否可以将您的工具集成到其他框架中。您的工具可以是 eclipse oder intellij 插件吗?也许可以在没有 gui 的情况下配置 eclipse 实例。 Polyglot 旨在扩展。【参考方案3】:

Eclipse 有一个用于解析源代码并从中创建抽象语法树的库,可以让您提取所需的内容。

请参阅此处获取教程 http://www.vogella.de/articles/EclipseJDT/article.html

请参阅此处获取 api http://help.eclipse.org/indigo/topic/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/dom/package-summary.html#package_description

【讨论】:

【参考方案4】:

现在我有两种识别方式:

你还有更多的方法。 JavaCC 附带已经构建的 Java 1.5 语法。我确信其他解析器生成器也是如此。您没有理由必须编写自己的语法或构建自己的解析器。

特别是“将输入源代码文件读取为文本并搜索特定模式”根本不是一个可行的选择,因为它不进行解析,因此无法正确识别 Java 程序。

【讨论】:

同意你的看法.....我能得到更多关于这个 nJAVA 1.5 语法的信息吗?我的意思是如何使用它等等...... @Sudh:很抱歉这么说,但如果你不熟悉语法和编译器生成器的概念,你就没有能力做这个项目。这不是你要在论坛上学到的东西。 我不知道你从哪里得到这个想法......但我熟悉语法的概念......已经在基本的 flex/bison 上工作了一段时间......但那是基本的。 ...我知道这是高级的东西。但是没有挑战就没有乐趣不是吗?? @Sudh:我从您那里了解到您对语法不熟悉的想法。您可以在javacc.java.net 找到 JavaCC。坦率地说,我认为您本可以自己找到的。【参考方案5】:

您的输入文件是用 Java 编写的,软件应该是用 Java 编写的,但这是您的第一个 Java 项目?首先,我建议通过较小的项目来学习语言。您还需要学习如何在 Java 中使用图形(有各种库)。然后,您应该专注于要在图表上显示的内容。还是文字就够了?

【讨论】:

好吧,我会说...我熟悉该语言...已经在 it.db 访问和所有方面完成了一些较小的项目.......对摇摆有点熟悉。 .....我想在我的图表中显示控制流......还有源代码的类结构......【参考方案6】:

我的做法是分析编译后的代码。这将允许您在没有源代码的情况下阅读 jar,并避免自己解析代码。我会使用 Objectwebs ASM 来读取类文件。

【讨论】:

好吧..用例说它应该能够从源代码文件中做到这一点......因为他们未来计划将其扩展到其他语言......所以。 .. 这些语言也可以编译成.class文件吗?例如Groovy、SCala、JRuby、Jython 等?应用程序中的大部分 Java 代码已经编译。你需要一些方法来分析它。 我的意思是他们未来计划扩展此应用程序以分析用其他语言(如 C/C++、javascript 等)编写的源代码......所以分析编译后的代码不会是一种有效的方法解决方案....【参考方案7】:

更智能的解决方案是使用 Eclipse 的 java 解析器。在这里阅读更多:http://www.ibm.com/developerworks/opensource/library/os-ast/

【讨论】:

我不确定我是否正确理解了这篇文章......因为他们正在从编译单元创建一个类......但我不需要做相反的事情吗?我的意思是我将拥有一个 JAVA 程序的源代码,我需要做的是创建它的类结构和控制流..我在这里可能错了...... 链接暂时失效 此链接已失效,请删除帖子或修复链接!【参考方案8】:

或者更简单:使用反射。您应该能够编译源代码,使用 java 类加载器加载类并从那里分析它们。我认为这比任何解析都容易得多。

【讨论】:

@sudh:重读问题后,我明白它不应该分析类,而应该分析单个控制结构。我想这是不可能的反射......也许这是downvote的原因......【参考方案9】:

我们的DMS Software Reengineering Toolkit 是通用程序分析和转换机器,具有解析、构建 AST、构建符号表、提取控制和数据流、转换 AST、将 AST 漂亮地打印回文本等功能。

DMS 由显式语言定义参数化,并具有a large set of preexisting definitions。

DMS 的Java Front End 已经计算了control and data flow graphs,因此您的问题将简化为导出它们。

编辑 7/19/2014:现在处理 Java 8。

【讨论】:

hmm....会试一试...但是如何在我的应用程序中包含(可能合并)...。 如果你有流程图,你还不清楚你想用它做什么。在没有任何特定要求的情况下,最简单的方案是配置 DMS 以提取该信息并简单地将其作为子进程启动。 它看起来像一个旧的无人维护的库。 你到底是怎么得出这个结论的? DMS 25 多年来一直在积极开发和增强。我们用它构建各种工具,并积极将 COBOL 中的百万行系统迁移到 Java。

以上是关于解析 Java 源代码的主要内容,如果未能解决你的问题,请参考以下文章

java代码解析二维码

解析java源代码以查找评论中的特定单词,然后使用下面的代码[重复]

Java Arrays.sort源代码解析

JDK核心JAVA源代码解析 - Object

Java 1.7 ThreadPoolExecutor源代码解析

Java集合ArrayList源代码详细解析