我的目标是分析java源文件以查找包含非注释代码的行号。由于StreamTokenizer有slashStarComments()和slashSlashComments(),我想我会用它来过滤掉只有注释而没有代码的行。
下面的程序会打印该行上的行号和任何字符串标记,对于每行都不具有注释的行。
当时最,但有时不... 例如,每次都会跳过行号,然后从log4j,Category.java中的以下源文件中的注释行144开始: http://logging.apache.org/log4j/1.2/xref/org/apache/log4j/Category.html StreamTokenizer有时似乎只是在javadoc注释结束时跳过一些行。
这是我的代码:
import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.io.StreamTokenizer; public class LinesWithCodeFinder { public static void main(String[] args) throws IOException { String filePath = args[0]; Reader reader = new FileReader(filePath); StreamTokenizer tokenizer = new StreamTokenizer(reader); tokenizer.slashStarComments(true); tokenizer.slashSlashComments(true); tokenizer.eolIsSignificant(false); int ttype = 0; int lastline = -1; String s = ""; while (ttype != StreamTokenizer.TT_EOF) { ttype = tokenizer.nextToken(); int lineno = tokenizer.lineno(); String sval = ttype == StreamTokenizer.TT_WORD ? tokenizer.sval : ""; if (lineno == lastline) { s += " " + sval; } else { if (lastline != -1) System.out.println(lastline + "\t" + s); s = sval; } lastline = lineno; } } }
有没有人理解为什么StreamTokenizer的行为与它一样?
有关如何过滤评论的任何其他想法将不胜感激。
答案 0 :(得分:1)
评论中的段落丢掉了行数。从第137行开始......
/**
This constructor created a new <code>Category</code> instance and
sets its name.
<p>It is intended to be used by sub-classes only. You should not
create categories directly.
@param name The name of the category.
*/
......两个空行将行数减去2。因此,第146行报告为144行等。但不确定原因。如果您将注释更改为以下内容:
/**
This constructor created a new <code>Category</code> instance and
sets its name.
<p>It is intended to be used by sub-classes only. You should not
create categories directly.
@param name The name of the category.
*/
...评论后的行号将正确报告。
答案 1 :(得分:1)
我想我在StreamTokenizer中发现了这个错误! 我复制了类并将其重命名为MyStreamTokenizer,并从:
更改了第700行if (c == '\n')
到
while (c == '\n')
它有效!
是一个令人讨厌的错误@author James Gosling
@since JDK1.0
答案 2 :(得分:0)
尝试使用codehaus javancss库(NCSS =非评论来源声明) 在http://repo1.maven.org/maven2/org/codehaus/javancss/javancss/32.53/
的中央maven仓库中有一个罐子和来源答案 3 :(得分:0)
我刚刚发现SDN的bug数据库中有一个未修复的错误,错误4517649标记为“已关闭,无法修复”。 http://localhost/hawk.html?gwt.codesvr=127.0.0.1:9997&locale=en
由于兼容性限制我们 不会进一步发展这一遗产 类。 xxxxx @ xxxxx 2002-02-14
没有给出解决方法: - (