найти имя функции и сосчитать ее LOC - PullRequest
4 голосов
/ 31 мая 2009

Итак, вы знаете, что это все, это проект, который мне назначен. Я не ищу ответ в коде, но больше направление.

То, что мне сказали сделать, - это просмотреть файл и сосчитать фактические строки кода, одновременно записывая имена функций и отдельные строки кода для функций. Проблема, с которой я сталкиваюсь, заключается в определении способа чтения файла из файла, чтобы определить, является ли строка началом функции.

Пока что я могу думать только о том, чтобы иметь строковый массив типов данных (int, double, char и т. Д.), Искать его в строке и затем искать в скобках, а затем искать отсутствие точка с запятой (так что я знаю, что это не просто объявление функции).

Итак, мой вопрос, это то, как я должен поступить, или есть другие методы, которые вы бы порекомендовали?

Код, на который я буду рассчитывать, будет на C ++.

Ответы [ 6 ]

7 голосов
/ 31 мая 2009

На ум приходят три подхода.

  1. Используйте регулярные выражения. Это довольно похоже на то, что вы думаете. Ищите строки, которые выглядят как определения функций. Это довольно быстро сделать, но может пойти не так во многих отношениях.

    char *s = "int main() {"
    

    не является определением функции, но, безусловно, выглядит так.

    char
    * /* eh? */
    s
    (
    int /* comment? // */ a
    )
    // hello, world /* of confusion
    {
    

    является определением функции, но не похоже на него.

    Хорошо: быстро писать, может работать даже при синтаксических ошибках; плохо: может легко осечить вещи, которые похожи (или не выглядят) на «нормальный» случай.

    Вариант: сначала запустите код, например, с помощью отступа GNU. Это позаботится о некоторых (но не обо всех) пропусках зажигания.

  2. Используйте правильный лексер и парсер. Это гораздо более тщательный подход, но вы можете повторно использовать лексер / анализ с открытым исходным кодом (например, из gcc).

    Хорошо: будет на 100% точным (никогда не пропускает). Плохо: одна пропущенная точка с запятой выдает ошибки.

  3. Посмотрите, есть ли у вашего компилятора какой-нибудь отладочный вывод, который может помочь. Это вариант (2), но вместо вашего собственного используется лексер / парсер вашего компилятора.

4 голосов
/ 31 мая 2009

Ваша идея может работать в 99% (или более) случаев. Только настоящий компилятор C ++ может выполнить 100%, и в этом случае я скомпилирую в режиме отладки (g++ -S prog.cpp) и получу имена функций и номера строк из информации отладки вывода сборки (prog.s).

Мои мысли по поводу 99% решения:

  • Игнорировать комментарии и строки.
  • Документ, который вы игнорируете директивы препроцессора (#include, #define, #if).
  • Все, что находится между верхним уровнем { и }, является функциональным телом, кроме как после typedef, class, struct, union, namespace и enum.
  • Если у вас есть class, struct или union, вы должны искать внутри него тела методов.
  • Иногда сложно найти имя функции, например, в long(*)(char) f(int);.
  • Убедитесь, что ваш парсер работает с шаблонными функциями и шаблонными классами.
3 голосов
/ 31 мая 2009

Для записи названий функций я использую PCRE и регулярное выражение

"(?<=[\\s:~])(\\w+)\\s*\\([\\w\\s,<>\\[\\].=&':/*]*?\\)\\s*(const)?\\s*{"

, а затем отфильтровывать имена, такие как "if", "while", "do", "for", "switch". Обратите внимание, что имя функции (\ w +), группа 1.
Конечно, это не идеальное решение, но хорошее.

2 голосов
/ 31 мая 2009

Как насчет написания сценария оболочки для этого? Программа на AWK, возможно.

2 голосов
/ 31 мая 2009

Я чувствую, что выполнение синтаксического анализа вручную будет довольно сложной задачей. Я бы, вероятно, использовал существующий инструмент, такой как RSM , перенаправил вывод в файл csv (при условии, что вы находитесь в Windows), а затем проанализировал файл csv, чтобы собрать необходимую информацию.

2 голосов
/ 31 мая 2009

Найдите приличную программу подсчета SLOC, например, SLOCCounter . Вы можете не только считать SLOC, но и сравнивать свои результаты. (Обновление: вот длинный список из них.)

Интересно, что число точек с запятой без комментариев в программе на C / C ++ является приличным количеством SLOC.

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