仅提取函数名称及其来自C代码的注释

时间:2011-11-08 13:08:39

标签: c perl sed awk comments

我想提取评论,并想知道它们是哪些功能。我有很多这样的C文件如下:

输入:

void main()
{
    //sdgs
    call A;
    /*
    sdfgs
    dfhdfh
    */
    call b;
    some code;
}

/* this function adds
 something */
int add()
{
    //sgsd
    some code;
    //more comments
    some code;
}

输出应为:

void main()
{
    //sdgs

    /*
    sdfgs
    dfhdfh
    */

}

/* this function adds
 something */
int add()
{
    //sgsd

    //more comments

}

输入代码格式整齐,“功能代码”在下一行{后开始。 基本上,我只需要知道哪个“评论”来自哪个函数。此外,它还应包括功能名称或其他地方的任何其他注释。 注意:这是不同的,因为顶级的功能名称应该在那里。

为了简化我的要求:

  1. 打印所有评论
  2. 检测第一行包含(的块,在第一行后第一列只包含{的一行,并在上面打印行。

3 个答案:

答案 0 :(得分:6)

使用正则表达式是不可能的,你需要编写一个小的C解析器。

为什么?

首先需要首先替换宏。其次,因为函数定义在正则表达式中有点“难”。一些法律功能定义:

int f() {}
const int f() {}
const char* f(int);
void f(double t);
void f(t,a) int t; int (*a)(float, char, char) {}

答案 1 :(得分:2)

它可能在一般意义上是不可行的(例如,因为函数可以通过显然是宏调用来定义)。

但是,如果你不关心完美,你可能会做一个简单的词法分析器&几乎完成工作的解析器(在输入代码上并不太费力)。

我不确定它是否有用。你应该解释一下你真正想要实现的目标。

答案 2 :(得分:0)

您希望仅从格式良好的文件中打印注释和功能定义。在我看来,没有适当的解析器,这个特定的任务是可行的。

尝试:

comments.awk:

/^(int|void|{|}|etc.)/{print $0;next}
/\/\*/,/\*\//{print $0;next}
/\s*\/\//{print $0;next}

致电:

awk -f comments.awk file1
相关问题