使用Python中的plyj解析Java源代码

4
我正在尝试解析Java源代码以获取方法名称、它们的调用、变量名称等信息。我在寻找一个预先构建或可扩展的Python模块时,偶然发现了plyj (https://github.com/musiKk/plyj)。
我想要查找一个方法,然后获取该方法的代码,并根据一些条件对其进行一些字符串处理。但是我无法理解它的使用方法,示例太过模糊。有人能指向一个好的使用示例吗?
此外,如果您能让我知道antlr3 (https://github.com/antlr/antlr3) 是否更易于使用(带有示例),因为我对这些模块都很陌生,不知道该选择哪个。我没有性能问题,只是想根据功能和易用性进行比较。
谢谢!

如果你想要关于类型的准确信息,你需要一个完整的Java名称和类型解析器,而antlr3将无法提供这个。如果plyj只是一个解析器(正如我怀疑的那样),它也不会提供这些信息。这种类型的信息很难推导出来;考虑一下Java参考手册所花费的篇幅来说明所有符号的含义。你可能能够从原始解析中获得未经限定的类和方法名。这足够吗?(要找到一个方法,你可能已经需要进行完整的名称类型解析;否则 A:B:C 的意思是什么?) - Ira Baxter
@Ira:我不明白你的意思,请详细说明。 - krish7919
好的。你想在类A:B:C中查找方法名称。如果不知道B在哪里定义并处理包B的内容以查找C的声明,那么你将如何找到C所在的位置?使用泛型会使情况变得更糟。 - Ira Baxter
不,我不会让它变得太复杂!我想要的是一个脚本,它可以将一个 .java 文件作为输入,并告诉我其中的方法,获取一个方法的代码,获取类变量名称。换句话说,我可以使用正则表达式查找方法,但那将会太过复杂,我想使用其中一个解析器来完成这个任务。 - krish7919
1
@Krish: 我添加了两个示例程序,可打印提供的源文件中的一些符号。 - musiKk
显示剩余2条评论
1个回答

2
如果您可以接受启发式解决方案,那么请获取任何一个具有可靠的Java解析器并构建AST(我的理解是ANTLR对于Java来说非常好),解析源代码,并构建自定义代码以遍历树形数据结构以查找类声明,并向下遍历一层以到达方法/成员。[我不知道PlyJ是否有经过测试的Java语法或构建AST]。
至少对于ANTLR解决方案而言,打印这些名称应该相当容易。打印主体则不太容易;据我所知,ANTLR没有简单的方法将子树作为文本打印出来。如果可以,您可能会发现在词法分析期间消除了注释。您可能能够从树节点中提取行号,然后返回原始文件并打印行号范围以获取方法主体。(大多数解析器生成器即使构建AST也不支持打印任意子树,因此我认为pylj也不例外)。
这种方法无法很好地处理每个文件中的多个类或嵌套类。
有一些工具可以可靠且准确地执行此操作,但需要更多的投入。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接