Подсчет количества комментариев в 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
/*
*/
4 ответа
Я думаю, у вас есть проблема в том, что комментарии могут появляться внутри или в конце строки...
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);
}
Конечно, проблема здесь в том, что если в кавычках встречаются последовательности "//", "/* " или "*/"....?
Весь подход несовершенен. Вам нужно правильно проанализировать исходный файл, по крайней мере, вам нужно правильно отслеживать кавычки и вложение "/*". Обратите внимание, что любая комбинация символов комментария может появляться внутри операторов, например:
System.out.println("// this is *not* a line comment");
String s = "*/ this is not the end of a block comment";
и так далее. Затем происходит странное поведение с escape-последовательностями символов, обрабатываемыми до интерпретации файла:
\u002F* this is a valid comment */
Не так просто определить, что является комментарием, а что нет:). Я настоятельно рекомендую вам найти решение парсера с открытым исходным кодом для java-источников.
package com.usaa.training;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class CommentsReading {
public static void main(String[] args) {
String line = "";
int number_of_blocks = 0;
int comment_count = 0;
int line_count = 0;
int TODO = 0;
int single_comment_count = 0;
int multiple_comment_count = 0;
try {
File file = new File("C:\\code\\InvolvedPartyBasicInfoMapper.java");
BufferedReader br = new BufferedReader(new FileReader(file));
while ((line = br.readLine()) != null) {
line_count++;
;
if (line.contains("//")) {
if (line.contains("TODO")){
TODO++;
}
comment_count++;
single_comment_count++;
} else if (line.contains("/*") )
{
if (line.contains("TODO")){
TODO++;
}
comment_count++;
multiple_comment_count++;
if (line.endsWith("*/"))
{
break;
}
while (!(line = br.readLine()).endsWith("'*/'") )
{
line_count++;
comment_count++;
multiple_comment_count++;
if (line.endsWith("*/"))
{
number_of_blocks++;
break;
}
}
}
}
br.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Total # of Lines = " + line_count);
System.out.println("Total # of Comment Lines= " +comment_count);
System.out.println("Total # of Single line Comments= " +single_comment_count );
System.out.println("Total # of Comment lines with Block Comments = " +multiple_comment_count );
System.out.println("Total # of Block line Comments = " +number_of_blocks);
System.out.println("No of TODO's = " +TODO);
}
}
Я не проверял ваш код, однако, я считаю, что это должно работать:
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);
}
Когда вы встретите /*
Вы должны увеличить счетчик и пропустить раздел комментариев.
enter code here
public class FilterInputStreamDemo {
public static void main(String[] args) {
String line = "";
int comment_count = 0;
int line_count = 0;
int single_comment_count = 0;
int multiple_comment_count = 0;
try {
BufferedReader br = new BufferedReader(new FileReader("comments.txt"));
while ((line = br.readLine()) != null) {
line_count++;
if (line.startsWith("//")) {
comment_count++;
single_comment_count++;
} else if (line.startsWith("/*")) {
comment_count++;
multiple_comment_count++;
while (!(line = br.readLine()).endsWith("'*\'")) {
comment_count++;
multiple_comment_count++;
break;
}
}
}
br.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("comment_count=" + comment_count);
}
}
Ребята, здесь простое решение. Просто скачайте программу Cloc по этой ссылке для Windows. Это программное обеспечение поддерживает все языки и может также принимать папки с файлами. Поместите вашу папку и cloc в то же место и откройте cmd введите эту команду
cloc-(version no).exe (folder name)
cloc-1.64.exe main
и иметь количество строк, пустую строку и общее количество строк в коде.
Для более подробной информации смотрите это: http://cloc.sourceforge.net/