【问题标题】:how to auto generate eclipse-indigo method block comment?如何自动生成 eclipse-indigo 方法块注释?
【发布时间】:2012-05-09 22:03:41
【问题描述】:

我想像这样使用 eclipse-Indigo 生成块注释。我是 C++ 程序员。

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

我怎么能这样。

【问题讨论】:

  • 你是什么意思?从 C++ 程序生成 C++?这不需要编写一个 c++ 解析器和词法分析器,本质上是一个编译器吗?函数的语法差异很大。有 freind 函数,它们可以是类的成员,因此它们可以具有 classname::,
  • 它们可以是命名空间的一部分,因此它们可以是 std:: 或任何命名空间,它们可以选择返回 const、返回指针、返回 void、返回 void 指针、返回函数指针(哎呀,什么一个想法),参数可以有或没有引用,是否有 const 以及我之前提到的所有功能等。如果你知道你将获得的函数的确切格式,那么对你有好处,写一个相对容易词法分析器。
  • 对不起,我想你现在明白我的意思了。
  • @Seshagiri 感谢您的反馈,我曾尝试使用 Doxygen,但仍然无法从我的 C++ 方法中获得块注释

标签: c++ comments eclipse-indigo


【解决方案1】:

如果您的输入几乎是静态的,您可以编写一个可以工作的简化词法分析器,需要简单的字符串处理。 string 具有许多不错的编辑功能,其中包含 .substr() 和 .find() 。你所要做的就是弄清楚perens在哪里。您知道您可以选择将其作为字符串流处理,这使得 FAR 更容易(不要忘记使用 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;

这将处理任意数量的参数,除了...变量参数类型。但是您可以为此输入自己的检测代码以及在 ... 和 2 关键字参数类型之间切换的 if 语句。在这里,我的结构中只支持 2 个关键字。您可以通过使用 while 在 while 循环中搜索 next 、逗号或 ) 之前的所有空格来支持更多,将可变数量的字符串添加到要替换的结构内的 vector&lt;string&gt; - 不,只需创建一个vector&lt;vector&lt;string&gt; &gt;。或者,只需一个向量,然后在每个函数完成后执行va.clear()

我刚刚注意到了 eclipse 标签。我对日食了解不多。我什至无法让它工作。一些程序。

【讨论】:

    猜你喜欢
    • 2016-05-05
    • 2013-05-27
    • 2012-03-25
    • 2012-06-23
    • 2012-09-16
    • 2017-08-21
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    相关资源
    最近更新 更多