2012-04-30 3 views
0

Я хочу генерировать комментарий блока, используя eclipse-Indigo, как это. Я программист на C++.Как автогенерировать комментарий к блоку eclipse-indigo?

/** 
* 
* @param bar 
* @return 
*/ 
int foo(int bar); 

как я могу это сделать.

+0

Как вы это понимаете? Генерирование C++ из C++-программы? не требует ли это написания парсера C++ и lexer, по существу компилятора? синтаксис функций сильно варьируется. есть функции freind, они могут быть членами класса, поэтому они могут иметь classname ::, –

+0

, они могут быть частью пространства имен, поэтому они могут быть std :: или любым пространством имен, они могут необязательно возвращать const, указатели возврата, return void, return void pointers, указатели функции возврата (bleah, что за мысль), аргументы могут иметь ссылки или нет, иметь const или нет и все предыдущие функции, о которых я упоминал, и т. д. ЕСЛИ вы знаете точный формат функций, которые вы будете получив, тогда хорошо для вас, относительно легко написать лексер. –

+0

извините за ошибку сейчас, я думаю, вы можете понять, что я имею в виду. – user881703

ответ

0

Если ваш вход довольно статичен, вы можете написать упрощенный лексер, который будет работать, требует простого разбиения строк. строка имеет много хороших возможностей редактирования в ней с помощью .substr() и .find(). все, что вам нужно сделать, это выяснить, где находятся перны. вы знаете, вы можете дополнительно процесс это как stringstream, что делает это гораздо проще (не забудьте использовать STD :: skipws пропустить пробелы.

http://www.cplusplus.com/reference/string/string/substr/

http://www.cplusplus.com/reference/string/string/find/

#include <vector> 
#include <string> 

typedef STRUCT arg_s { 
string sVarArgDataType, sVarArg; 
} arg_s ARG; 
ARG a; 
vector<ARG> va; 
char line[65000]; 

filein.getline(line, 65000); 
line[65000-1]='\0'; //force null termination if it hasn't happened 
get line and store in string sline0 
size_t firstSpacePos=sline.find(' '); 
size_t nextSpacePos = sline.find(' ',firstSpacePos+1); 
size_t prevCommaPos = string::npos; 
size_t nextCommaPos = sline.find(','); 
size_t openPerenPos=sline.find('('); 
size_t closePerenPos=sline.find(");"); 
string sReturnDataType, sFuncName; 
if (
    string::npos==firstSpacePos|| 
    string::npos==semicolonPos|| 
    string::npos==openPerenPos|| 
    string::npos==closePerenPos) { 
    return false; //failure 
} 
while (string::npos != nextSpacePos) { 
    if (string::npos != nextCommaPos) { 
     //found another comma, a next argument. use next comma as a string terminator and prevCommaPos as an arg beginning. 
     //assume all keywords are globs of text 
     a.sVarArgDataType=sline.substr(prevCommaPos+1,nextSpacePos-(prevCommaPos+1)); 
     a.sVarArg=sline.substr(nextSpacePos+1,nextCommaPos-(nextSpacePos+1)); 
    } else { 
     //didn't find another comma. use) as a string terminator and prevCommaPos as an arg beginning. 
     //assume all keywords are globs of text 
     a.sVarArgDataType=sline.substr(prevCommaPos+1,nextSpacePos-(prevCommaPos+1)); 
     a.sVarArg=sline.substr(nextSpacePos+1,closePerenPos-(nextSpacePos+1)); 
    } 
    va.push_back(a); //add structure to list 
    //move indices to next argument 
    nextCommaPos = sline.find(',', secondSpacePos+1); 
    nextSpacePos = sline.find(' ', secondSpacePos+1); 
} 
int i; 

fileout<<"/** 
* 
"; 
for (i=0; i < va.size(); i++) { 
    fileout<<" * @param "<<va[i].sVarArg; 
} 
fileout<<" 
* @return 
*/ 
"<<sReturnDataType<<" "<<sFuncName<<'('; 
for (i=0; i < va.size(); i++) { 
    fileout<<va[i].sArgDataType<<" "<<va[i].sVarArg; 
    if (i != va.size()-1) { 
     fileout<<", "; //don;t show a comma-space for the last item 
    } 
} 

fileout<<");"<<std::endl; 

это будет обрабатывать любое количество аргументов EXCEPT ... тип аргумента переменной, но вы можете ввести свой собственный код обнаружения для этого и оператор if, который отключается между ... и аргументами с двумя ключевыми словами. Здесь я поддерживаю только 2 ключевых слов в моей структуре. Вы можете поддерживать больше, используя время, чтобы найти все пробелы перед next, comma or) right peren внутри цикла while добавьте переменное число строк к vector<string> внутри структуры, которую вы собираетесь заменить - нет, просто сделайте vector<vector<string> >. или только один вектор и выполните va.clear() после выполнения каждой функции.

Я только что заметил тег затмения. Я ничего не знаю о затмении. Я даже не могу заставить его работать. некоторые программы.