如何使用javac工具解析器从java文件中读取内联注释?

时间:2013-02-01 22:40:08

标签: java parsing javac

我正在使用tools.jar中的javac(即JavaCompiler)来解析java文件。我使用TreePathScanner的实现来解析源代码。到目前为止,一切似乎都很好,因为我可以解析导入,包名,类名,方法名,说明......

但是我对内联注释有问题 - 我不能简单地让它们出现在创建的AST树中,或者访问它们。但是,我能够读取类,方法等的 javadoc注释,但没有内联注释。

如何以最佳方式阅读内联评论?我正在查看netbeans源代码(因为它也使用javac进行解析),但我无法轻易找到任何相关内容。

我绝望的解决方案是使用源文件的语句位置,然后手动解析注释两个语句之间的所有内容。或类似的事情,但在两个树节点之间。

有谁知道更好的解决方案?谢谢!

2 个答案:

答案 0 :(得分:4)

你做不到。编译器抛弃它们。编译器总是这样做。 Java编译器不会抛弃Javadoc注释,因为Javadoc使用编译器来查找它们,而Javadoc人员与编译器人员聚在一起。

答案 1 :(得分:1)

“编译器解析器”和“重新设计解析器”之间的关键区别与捕获有关文字的布局,注释和格式的信息有关。正如其他人所观察到的那样,大多数编译器都抛弃了所有这些信息,因为它与编译低级代码没有密切关系。

类似地,经典的解析器生成器(例如JavaCC,ANTLR等)几乎不支持捕获/重新生成此信息。

相反,重新设计解析器用于分析代码注释,有时甚至修改代码而不会丢失(或适当修改注释)。对于带注释的代码分析,你不能丢弃注释: - }对于代码修改,如果你基于原始重新生成更改的代码,如果更改的代码保留代码布局,注释和文字“格式”(例如, ,将十六进制文字作为十进制值进行重新定义是合法且等效的,但会使原作者非常不满意。要做到这一点,重新设计解析器需要特殊的词法分析器来捕获所有这些数据,并解析不会丢弃它的机器。

我们的DMS软件再造工具包包括作为通用机器的再造解析器;基于DMS的解析器适用于各种语言(包括OP对Java的兴趣)。 DMS捕获所有注释/布局/格式信息。分析工具可以访问所有内容。

TXL和Stratego也为此提供了一些支持。