Perl regex - 在C文件中查找函数并打印它们的定义

时间:2016-05-05 11:52:53

标签: regex perl

- 更新 -

我想在文件中找到C函数并打印他们的definitios

例如:

对于此输入:

#include <stdlib>

int function(int a)
{
    return a;
}

void func2()
{
    int b = 1;
}

int func3(int a,int b)
{
   a = a +b;
        while(x) {
            x--;
        }
   return a;
}

int main(int argc, char* argv[])
{
    int x=(a+1);
    return 0;
}

输出应为:

int function(int a);
void func2();
int func3(int a,int b);

这是我的代码:

#!/usr/bin/perl -w
open(FILE, "<", $ARGV[0]) or die "file open error";

if ( @ARGV ) #if there are args
{
    if ( -f $ARGV[0] ) #if its regular file
    {

    while(<FILE>)
      {
      if ($_ =~ /(.+)\s(.+)\(/){
      print $1; # type in arg $1
      print "\n";
      print $2; # name in arg $2
      print "\n";
    }
      }
    }
    else{
print "Arg is not a file\n";}
}
else{
print "no args\n";}

我以arg $ 1中的函数类型和$ 2中的函数名结束。我想在$(2)中的'()'括号中获取全名和args。如何避免'主'字? '^ [(主要)]不起作用。最后我想用';'打印所有内容最后。

它需要检查{}括号不打印例如:int x =(a + 1);

1 个答案:

答案 0 :(得分:1)

尝试/(\S+)\s+(\S+\([^)]*\))/,然后print $1+$2+";\n"

要防止main出现负面预测:

/(\S+)\s+((?!main)\S+\([^)]*\))/

如果不支持预测:

/(\S+)\s+((m|ma|mai|[^m].*|m[^a].*|ma[^i].*|mai[^n].*)\([^)]*\))/

负责避免main的部分:

(m|ma|mai|[^m].*|m[^a].*|ma[^i].*|mai[^n].*)