使用java中的antlr获取有关java类的元数据

使用java中的antlr获取有关java类的元数据,java,antlr,Java,Antlr,我已经从Antlr站点下载了AntlR3.3和AntlRworks,以及Java.g。我能够使用Antlr works for java.g成功地生成JavaParser、JavaLexer.java和令牌。然后,我在IDE中安装了antlr jar,并按照以下说明在代码中使用它: 第一个问题出现在上面的文档中,它要求对以下行进行编码: RuleReturnScope result = parser.compilationUnit(); 问题是parser.compilationUnit()

我已经从Antlr站点下载了AntlR3.3和AntlRworks,以及Java.g。我能够使用Antlr works for java.g成功地生成JavaParser、JavaLexer.java和令牌。然后,我在IDE中安装了antlr jar,并按照以下说明在代码中使用它:

第一个问题出现在上面的文档中,它要求对以下行进行编码:

RuleReturnScope result = parser.compilationUnit();
问题是parser.compilationUnit()不返回结果

然后,我尝试在“解析树”下进一步遵循该示例,但这是不完整的

我找不到任何关于如何使用这个库的好文档

以下是我想做的: -在Java中,将文件名、文件对象或文件内容作为字符串提交到Antlr,并让它返回某种类型的对象,我可以在代码中导航这些对象,这些代码将提供诸如导入、方法、类变量、表达式等内容

基本上,NetBeans IDE 6.9.1对重构所做的工作,如修复导入、转到源代码、重命名变量等。我所需要的只是类的元数据,我不知道如何获取它


谢谢。

要回答您的问题,为什么
compilationUnit
不返回任何结果,是因为如果您自己不在规则上指定返回类型,解析器规则就会被转换为

public void nameOfTheParserRule() { 
    ... 
} 
如果您在语法的选项{…}部分将输出设置为AST,那么默认情况下,解析器规则将返回类型为的对象,我怀疑这在您的情况下是错误的,但是我不能确定,因为您没有发布您的语法,并且您给语法Java.g的链接没有生成任何东西:在能够从它生成解析器和词法分析器之前,需要对它做某些事情。你很可能做了错事:)


祝你好运

要回答您的问题,为什么
compilationUnit
不返回任何结果,是因为如果您自己不在规则上指定返回类型,解析器规则就会被转换为

public void nameOfTheParserRule() { 
    ... 
} 
如果您在语法的选项{…}部分将输出设置为AST,那么默认情况下,解析器规则将返回类型为的对象,我怀疑这在您的情况下是错误的,但是我不能确定,因为您没有发布您的语法,并且您给语法Java.g的链接没有生成任何东西:在能够从它生成解析器和词法分析器之前,需要对它做某些事情。你很可能做了错事:)


祝你好运

有各种各样的
Java.g
语法:你能发布你(整个!)修改过的
.g
语法文件吗?你到底想从
.java
源文件中提取什么?我的语法是antlr中的语法,可以在这里找到:我试图提取我在上面的消息中描述的内容(导入、方法名称、变量名称和方法内容,它们本身被解析为带有变量的表达式等)现在最重要的是进口,但我也想要其他的。你真的需要从头开始写吗?这是一个(学术)练习,还是你的工作需要这样做?如果是后者,我强烈建议使用已经这样做的第三方工具或库。例如,重命名源文件中的变量是相当棘手的:您需要跟踪源文件中的所有作用域,当其他源文件使用公共/受保护的变量时,这还不到一半。但是,如果这是一个练习,我可以想象你是以“艰难”的方式来做的,但至少从帕尔关于ANTLR的书开始。有各种各样的
Java.g
语法:你能发布你(整个!)修改过的
.g
语法文件吗?你到底想从
.java
源文件中提取什么?我的语法是antlr中的语法,可以在这里找到:我试图提取我在上面的消息中描述的内容(导入、方法名称、变量名称和方法内容,它们本身被解析为带有变量的表达式等)现在最重要的是进口,但我也想要其他的。你真的需要从头开始写吗?这是一个(学术)练习,还是你的工作需要这样做?如果是后者,我强烈建议使用已经这样做的第三方工具或库。例如,重命名源文件中的变量是相当棘手的:您需要跟踪源文件中的所有作用域,当其他源文件使用公共/受保护的变量时,这还不到一半。但是,如果这是一个练习,我可以想象你用“艰难”的方式来做,但至少从帕尔关于ANTLR的书开始。我不确定你所说的“不产生任何东西”是什么意思。我能够使用antlr从中生成解析器、lexer和令牌文件。至于修改它,我不知道该怎么办。由于我需要有关导入、变量和方法的元数据,您能否在我发送给您的语法链接上更详细地发布我需要修改的内容以实现这一点?这是一个困难的过程吗?还有,一旦我做了修改,你能发布一些java代码来解析java文件并提取eg的导入和方法名称吗?我还试图找到NetBeans IDE使用的语法,因为它们似乎使用antlr,IDE可以识别导入、方法和变量,因为我可以在IDE中重构方法、变量等。在我的应用程序中,我需要相同级别的粒度。我是antlr的新手,我不确定要从中得到我想要的东西有多难。所以你提供的例子越多,对我就越有用。谢谢我在Java中使用的代码直接来自antlr示例(我在文章中发送的链接),如下所示:“JavaLexer lexer=newJavaLexer(cs);CommonTokenStream令牌=新的CommonTokenStream();setTokenSource(lexer);grammars.output.Jav