2016-02-18 7 views
1

Я разрабатываю инструмент для анализа и предоставления некоторой статистики о исходном коде других людей, инструмент сможет распознавать многие вещи в коде! Прямо сейчас я застрял на подсчете количества комментариев по коду, мой текущий код:Подсчитайте количество комментариев в java

public static void main(String[] args) { 

    String line = ""; 
    int count = 0; 
    try { 
     BufferedReader br = new BufferedReader(new FileReader("comments.txt")); 
     while ((line = br.readLine()) != null) { 
      if (line.startsWith("//")) { 
       count++; 
      } else if (line.startsWith("/*")) { 
       count++; 
       while (!(line = br.readLine()).endsWith("'*\'")) { 
        count++; 
        break; 
       } 
      } 
     } 
     br.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    System.out.println("count=" + count); 
} 

Чтобы проверить код, я использую тестовый файл. Но код дает мне неправильный результат в обоих файлах, например; Я получаю три в следующем файле

Yes 
//comment 
yes 
yes 
/* 
if 
random 
test 
test 
*/ 

Хотя ответ должен быть двух комментариев!

В следующем файле, он показывает мне, что у меня есть пять комментариев, а я до сих пор на самом деле есть два

Yes 
//comment 
yes 
yes 
/* 
if 
random 
test 
test 
/* 
*/ 
+0

не ответ, но родственный: посмотрите на [Sonar] (http://www.sonarqube.org/) и [Codepro AnalytiX] (https://developers.google.com/java-dev-tools/codepro/doc/features/metrics/metrics) – Nivas

+0

Ваш код не учитывает количество комментариев, но (пытается подсчитать) количество строк комментариев , '' '* \' "' Должен быть '' */"'. Кроме того, во внутреннем цикле вы не проверяете NULL-строки.Лучше придерживаться 1 цикла и установить логическое значение, чтобы указать, если вы находитесь внутри многострочного комментария '/ * .. * /'. – Kenney

+0

Комментарии BTW могут появляться в любом месте в строке. на самом деле у вас может быть несколько комментариев по строке. –

ответ

0

Я думаю, что у вас есть проблема в том, что комментарии могут произойти внутри или в конце строки, а ...

public static void main(String[] args) { 

    String line = ""; 
    int count = 0; 
    try { 
     BufferedReader br = new BufferedReader(new FileReader("comments.txt")); 
     while ((line = br.readLine()) != null) { 
      if (line.contains("//")) { 
       count++; 
      } else if (line.contains("/*")) { 
       count++; 
       while (!line.contains("*/") && !(line = br.readLine()).contains("*/")); 
      } 
     } 
     br.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    System.out.println("count=" + count); 
} 

Конечно проблема здесь в том, что если «//», "/* "или" */"происходят в цитированном тексте ....?

+1

Ваша программа скажет, что ваша программа содержит два комментария. ;) –

+1

Вот что он хотел увидеть! –

+0

Большинство программ не будут иметь таких строк. ;) –

0

Я не проверял код, однако, я считаю, что это должно работать:

public static void main(String[] args) { 

    String line = ""; 
    int count = 0; 
    try { 
     BufferedReader br = new BufferedReader(new FileReader("comments.txt")); 
     while ((line = br.readLine()) != null) { 
      if (line.startsWith("//")) { 
       count++; 
      } else if (line.startsWith("/*")) { 
       count++; 
       while ((line = br.readLine())!=null && !line.endsWith("'*\'")); 
      } 
     } 
     br.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    System.out.println("count=" + count); 
} 

Когда вы встретите /*, вы должны увеличить счетчик и пропустить раздел комментария.

+0

спасибо за ваш ответ, я очень ценю это! Но ответ дает ошибку: Исключение в потоке «главный» java.lang.NullPointerException \t в countcomment.CountComment.main (CountComment.java:33) Java Результат: 1 по адресу: в то время как ((строка = бр .readline()) EndsWith (" '* \'")). – user5923402

+0

@ user5923402 Я отредактировал свой фрагмент, попробовав его сейчас. – NAIT

+0

в течение первых двух файлов она работает, но только небольшой редактировать в файле как: Да // комментарий да да /* если случайный тест тест */ тест /* */ его все еще дает 2 – user5923402

5

Весь подход является ошибочным. Вам нужно правильно проанализировать исходный файл, по крайней мере, вам нужно правильно отслеживать кавычки и вложение «/ *». Обратите внимание, что любая комбинация комментариев может появляться внутри таких заявлений, как:

System.out.println("// this is *not* a line comment"); 
String s = "*/ this is not the end of a block comment"; 

и так далее. Тогда это странное поведение с помощью управляющих последовательностей символов обрабатывается до того, как файл интерпретируется:

\u002F* this is a valid comment */ 

Его не что легко определить, что является комментарием и Что нет :) Я настоятельно рекомендую вам взглянуть на открытый source parser для java-источников.

+1

И теперь кто-то имеет смысл. :) –

+0

Позвольте мне сделать это, и, возможно, у меня появятся дополнительные вопросы :) – user5923402

+0

Но в отношении примера, который вы дали; System.out.println ("// это * не * комментарий строки"); конечно, это не комментарий, и именно поэтому у меня есть условие if (line.startsWith ("//")); это не поможет? – user5923402

0

Ребята здесь легкое решение. Просто скачайте программное обеспечение cloc из этого link для окон. Эта поддержка программного обеспечения на всех языках & также может принимать папки с файлами. Положите вашу папку и CLOC в том же месте и открыть эту команду

cloc-(version no).exe (folder name) 
cloc-1.64.exe main 

CMD типа, и имеют не линии, пустую строки и общее количество строк в коде.

RESULTS:

Более подробно см это: http://cloc.sourceforge.net/