C ++ файл разбирает количество аргументов - PullRequest
2 голосов
/ 13 июля 2009

Я получил пакет файлов c ++ со статическим исходным кодом (уже разработан, не нужно ничего с ними делать).

Существует программа / lib / способ получить список количества параметров каждой функции в одном из этих файлов?

Я имею в виду, получить результат как:

#File a.cpp
##a() -> 3 paramss
##foo() -> 0 params (void)

#File b.cpp
##test() -> 1 param

....

И лучший вопрос.

Есть ли способ также обработать количество возвращаемых результатов?

#File a.cpp
##a() -> 3 params, 1 return
##foo() -> 0 params (void), 2 returns

Например, если «foo» возвращает, если условие истинно, и другое, если ложно

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 13 июля 2009

Вы можете попробовать запустить Doxygen поверх исходных файлов.

Поскольку содержимое (предположительно) недокументировано, вам необходимо настроить doxygen для извлечения содержимого из недокументированных файлов.

Если вы просто хотите просмотреть список доступных функций, вы можете использовать вывод HTML.

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

0 голосов
/ 13 июля 2009

Все это слишком, но, возможно, это может быть ваша чашка чая, Эльза может проанализировать c ++ и предоставить вам абстрактное синтаксическое дерево анализируемого файла. Там могут быть некоторые другие бесплатные инструменты, которые могут сделать то же самое

0 голосов
/ 13 июля 2009

Я бы посчитал число «,» и начал бы с 1. Это должно дать вам точное количество аргументов функции. Тогда я бы проверил, существует ли «void» перед именем функции, если нет, то можно поспорить, что есть возвращаемое значение.

ifstream infile;
infile.open(...);
int i, ret, args;
String s;

ret = args = 0;
s = infile.getline();
for( i=0; s[i] != '('; i++ ) {
 if( s[i] == 'v' && s[i+1] == 'o' && s[i+2] == 'i' && s[i+3] == 'd' ) {
  ret = 1;
  break;
 }
}

for( i=0; s[i] != '('; i++ ) {}

for( i; s[i] != ')'; i++ ) {
 if( args == 0 && s[i] != ' ' ) {
  args++;
 }
 if( s[i] == ',' ) {
  args++;
 }
}
...