Фильтрация комментариев Java с помощью StreamTokenizer - PullRequest
3 голосов
/ 24 августа 2010

Моя цель - проанализировать исходные файлы java, чтобы найти номера строк, содержащие код без комментариев.Поскольку StreamTokenizer имеет функции slashStarComments () и slashSlashComments (), я решил использовать его для фильтрации строк, содержащих только комментарии и без кода.

Программа, приведенная ниже, печатает номера строк и любые строковые токены на этомстрока, для каждой строки, которая имеет что-то, что не является комментарием.

Это работает в большинстве случаев времени, но иногда нет ... Например, номера строк пропускаются время от времени, а затем начинаются со строки комментария 144 в следующем исходном файле из log4j,Category.java: 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 ]

1 голос
/ 24 августа 2010

Я думаю, что нашел ошибку в StreamTokenizer! Я скопировал класс и переименовал его в MyStreamTokenizer и изменил строку 700 с:

if (c == '\n')

до

while (c == '\n')

и это работает! Гадкий баг от

@author  James Gosling 
@since   JDK1.0
1 голос
/ 24 августа 2010

Абзацы в комментариях сбрасывают счетчик строк.Начиная со строки 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.
*/

... две пустые строки сдвигают счетчик строк на два.Таким образом, строка 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.
*/

... номера строк после комментария будут отображаться правильно.

0 голосов
/ 05 сентября 2010

Я только что обнаружил, что в базе данных ошибок SDN есть нефиксированная ошибка, ошибка 4517649 с пометкой «Закрыто, не исправит» http://localhost/hawk.html?gwt.codesvr=127.0.0.1:9997&locale=en

Из-за ограничений совместимости мы не будет дальше развивать это наследие учебный класс. ххххх @ ххххх 2002-02-14

Обходной путь также не предоставляется: - (

0 голосов
/ 24 августа 2010

Попробуйте использовать библиотеку codehaus javancss (NCSS = Non-Commenting Source Statement).
В центральном репозитории Maven есть банка и источник по адресу http://repo1.maven.org/maven2/org/codehaus/javancss/javancss/32.53/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...