2013-02-01 27 views
6

我使用tools.jar中的javac(即JavaCompiler)来解析java文件。我使用TreePathScanner的实现来解析源代码。到目前为止,一切似乎都很好,我可以解析进口,包名,类名,方法名,指示...如何阅读使用javac工具解析器从java文件内嵌评论?

但我确实有内嵌意见的问题 - 我只是不能让他们出现在创建AST树,或访问它们。不过,我可以阅读javadoc评论的类,方法等,但没有内嵌评论。

如何以最佳方式阅读内嵌评论?我正在查看NetBeans源代码(因为它也使用javac进行解析),但我无法轻松找到任何关于它的任何信息。

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

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

+0

我看到com.sun.tools.javac.main.JavaCompiler默认将一些keepComments标志设置为false。那是你正在尝试使用的吗?你有尝试改变它吗? – jdb

+0

是的,我已经有这个设置为真,没有注意到任何区别。 – igr

回答

4

你不能。编译器将它们扔掉。编译器总是这样做。 Java编译器不会抛弃Javadoc注释,因为Javadoc使用编译器来查找它们,并且Javadoc人员与编译器人员一起工作。

+0

这是真的。我已经检查了javac的源代码并且在类Scanner中可以看到以下方法:'protected void processComment(CommentStyle style)',它只记录调试消息。我会试着看看我是否可以重写它。 – igr

+0

我设法运行不使用** JavaCompiler **的解析器,而只是** Scanner **和** Parser **类;并且能够覆盖'processComment'方法,但是...这种方法只是给出了评论已经被处理的信息以及评论类型和其他东西(比如值,位置等)。 – igr

+0

顺便说一句,看来,日食AST编译器保留评论。 – igr

1

“编译器解析器”和“重新设计解析器”之间的一个主要区别在于获取关于文字的布局,注释和格式的信息。正如其他人所观察到的,大多数编译器都会丢弃所有这些信息,因为将它们编译为低级代码没有密切关系。类似地,经典的解析器生成器(例如JavaCC,ANTLR等)提供了非常少的支持捕获/重新生成该信息的支持。

相比之下,再设计解析器用于分析代码注释,有时甚至可以修改代码而不会丢失(或适当修改注释)。对于包含注释的代码分析,您不能丢弃注释: - }对于代码修改,如果您基于原始代码重新生成已更改的代码,那么更改后的代码将保留代码布局,注释和文字“格式”(例如,将十六进制文字注册为十进制值是合法和等效的,但是使得原作者非常不高兴)。为此,重新设计解析器需要特殊的词法分析器来捕获所有这些数据,并解析不会丢弃的机器。

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

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