解析Java源代码

时间:2011-03-31 08:39:53

标签: java algorithm parsing compiler-construction logic

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

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

  1. 通过编写我自己的语法来解析源代码(我认为这是一个复杂的解决方案)。我正在考虑使用Antlr。
  2. 将输入源代码文件作为文本读取并搜索特定模式(可能效率低下)
  3. 我在这儿吗?或者我错过了一些非常基本和简单的东西?哪种方法花费的时间更少,工作效率更高?在这方面的任何其他建议也将受到欢迎。任何其他有效的方法都会有所帮助,因为输入源代码可能跨越多个文件,并且可能相当复杂。

    我擅长.NET语言,但这是我在Java中的第一个大项目。我对编译器设计有基本的了解,所以编写语法对我来说不是不可能的。

    对不起如果我不清楚。请询问任何澄清。

9 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

  

现在我有两种识别方式:

你还有很多方法。 JavaCC附带了已经构建的Java 1.5语法。我确定其他解析器生成器同上。您没有理由要编写自己的语法或构建自己的解析器。

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

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

DMS的Java Front End已经计算control and data flow graphs,因此您的问题将会减少到导出它们。

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