2009-07-13 3 views
1

У меня есть пакет C++-файлов со статическим исходным кодом (уже разработан, не нужно ничего им делать).C++ file parse number of arguments

Есть программа/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» имеет возврат, если условие истинно, и другое, если ложно

Спасибо заранее.

+1

Вы можете привести пример 'foo()', чтобы он имел 2 возврата? – SingleNegationElimination

+0

int foo() {if (blah) return 1; else return 0; } –

+0

как вы получаете 2 возвращения в C++? –

ответ

2

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

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

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

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

+0

Doxygen хорошо работал, создавая XML и HTML-файлы. Мне нужно только разобрать xmll, а затем hehe;) – Ragnagard

0

Я бы посчитал число «,» и начинал с 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++; 
} 
} 
+0

Подсчет запятых провалится на такие вещи, как шаблон <класс A, класс B> void doSomething (const SomeClass & thingy, const std :: string & other); –

+0

Вы правы, подсчет запятой завершился неудачей с помощью шаблонов в C++; более простой способ сделать это - написать регулярное выражение, чтобы сделать это. – Suroot

+0

У кода есть шаблоны (и много em), поэтому я не смог сделать это hehe – Ragnagard

0

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

+0

я могу попробовать это, когда я получу зависимости hehe – Ragnagard