【问题标题】:Extract function names only and their comments from C code仅从 C 代码中提取函数名称及其注释
【发布时间】:2011-12-24 10:50:24
【问题描述】:

我想提取 cmets 并想知道它们来自哪些函数。我有很多这样的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

}

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

为了简化我的要求:

  1. 打印所有 cmets
  2. 在第一行检测包含( 的块,在第一列的一到三行之后的第一列中检测到仅包含{ 的单行,并打印紧接在上面的行。

【问题讨论】:

    标签: c perl sed awk comments


    【解决方案1】:

    这对于正则表达式是不可能的,你需要编写一个小 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) {}
    

    【讨论】:

    • 只是出于好奇,什么是:“void f(t,a) int t;”在做什么?
    • @w00te:它声明了一个不返回任何内容(void)的函数,该函数接受两个参数,一个名为 tint 和一个以 float, char, char 作为参数并返回 @ 的函数的指针987654325@ 叫a。我确实犯了一个(现已编辑)错误,我忘记了函数指针的返回类型。此外,这是旧式函数声明和函数指针的组合。
    • 我虽然第三和第四个例子是一个有效的声明,但不是定义。
    • @sidyll: 当然可以,但是你可以很容易地用括号替换分号来定义它们,这只是一个例子。
    • 好的,如果第 x 行在第一列有 { 并且那是该行中唯一的内容,则 xl 的函数名称以 ) 结尾并上升到行号 (x 减去 --) 直到开始(
    【解决方案2】:

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

    但是,如果您不关心完美,您可以制作一个简单的词法分析器和解析器,它几乎可以完成这项工作(在不太做作的输入代码上)。

    我不确定它是否有用。你应该解释你真正想要达到的目标。

    【讨论】:

    • 函数名称未通过宏或任何其他复杂方式定义。它的功能类似于 unsigned int func_data( arg 1, aggr 2) {
    【解决方案3】:

    您只想从格式良好的文件中打印 cmets 和函数定义。在我看来,这个特定的任务在没有适当的解析器的情况下是可行的。

    试试:

    cmets.awk:

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

    调用:

    awk -f comments.awk file1
    

    【讨论】:

    • 但它打印包含 int 或 void 的函数名。那不是我想要的。我认为 awk/sed 是行处理器——除非可以看到前面的 3 或 4 行,否则它无法完成。感谢您的帮助
    猜你喜欢
    • 2012-06-16
    • 2011-11-20
    • 2016-04-03
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    相关资源
    最近更新 更多