Подсчет количества комментариев в 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/

Другие вопросы по тегам