使用StreamTokenizer过滤Java注释

时间:2010-08-23 22:25:17

标签: java filter comments

我的目标是分析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;
  }
 }
}
  1. 有没有人理解为什么StreamTokenizer的行为与它一样?

  2. 有关如何过滤评论的任何其他想法将不胜感激。

4 个答案:

答案 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

没有给出解决方法: - (