C++ 要获取由perl在多个c、cpp或.h文件中定义的函数名吗

C++ 要获取由perl在多个c、cpp或.h文件中定义的函数名吗,c++,c,regex,perl,C++,C,Regex,Perl,c、cpp和.h的文件语法示例 cpp文件 {< //-------------------------------------------------------------------------------------------- // FORWARD DECLARATION //-------------------------------------------------------------------------------------------- Result_

c、cpp和.h的文件语法示例 cpp文件

{< //--------------------------------------------------------------------------------------------
// FORWARD DECLARATION
//--------------------------------------------------------------------------------------------


Result_t
dumpAdSidToLocalGroupsAndPriv(uint32_t                             vserverId,
                              const Asid&                          userAsid,
                              AdSidToLocalGroupsAndPrivCacheEntry& valEntry,
                              const struct timeval&                entryTime)
{
-----------------------
}

//---------------------------------------------------------------------------/>}
像其他c和h一样明智

我想得到的是使用Perl正则表达式,我只想得到这些函数名作为输出。 我将这些文件作为输入传递给该Perl文件。我想将多个文件作为输入传递给该Perl文件

我使用的代码是:

{
use strict;
use warnings;

my $filename = $ARGV[0];  
my $filename1 ='report.txt';
open(my $fh1, '>>', $filename1) or die "Could not open file ".$filename;
print $fh1 "\n Output file \n";
my $data = do {
open my $fh, '<', $filename or die $!;
local $/;
<$fh>;
};

my $count = 0;
while ($data =~ /(.*::.*/g ) {
    my $word = $1;
    print $fh1 $word."\n";
    ++$count;
    print "%2d: %s\n", $count, $word;
}
}
{
严格使用;
使用警告;
我的$filename=$ARGV[0];
我的$filename1='report.txt';
打开(my$fh1,“>>”,$filename1)或死亡“无法打开文件”。$filename;
打印$fh1“\n输出文件\n”;
我的$data=do{

打开我的$fh,“你试图做的事是危险的。

<正则表达式不足以解析一种复杂的C++语言。你可以找到一个很好的讨论(虽然在这种情况下是关于HTML的,但它仍然适用)。正确的C++解析需要一个完整的解析器。根据我在阅读本文中的一些评论,我自己也很难理解C++,但是大多数的商业分析器都不能正确地处理它,因为它有太多的边缘情况。在某些情况下,roach是可能的。但你必须确保你的数据遵循某些模式,通常很难做出这样的假设

也就是说…您的代码甚至无法编译。您必须像这样修复regexp:

while ($data =~ /(.*::.*)/g ) {
#!/usr/bin/perl
use strict;
use warnings;

my $data = "int& myClass::Function1();\n"
         . "void * me::function2(const int& temp, double a, char[] b);\n"
         . "double** class::function_3 (int[] array, int& result);\n";

while ($data =~ /\s*(\w+([\s&\*]*))((::)?((\w+)::)?(\w+)\s*\(([^)]*)\)\s*;)/gs ) {
    my $return_type = $1;
    my $class = $6;
    my $function_name = $7;
    my $arguments = $8;
    print "return_type   = $return_type\n";
    print "class         = $class\n";
    print "function_name = $function_name\n";
    print "arguments     = $arguments\n";
}
但这意味着您只能找到属于类的函数,并且还会得到一些误报,因为class::function语法还可以用于调用函数,而不仅仅是定义函数,所以我会在.h文件中查找它们声明末尾的分号。命名空间也使用相同的
符号当我试图编写自己的ReGEXP解析C++(在发现它不能完成之前,如上面所解释的)时,我试图找到这样的东西:

while ($data =~ /(.*::.*)/g ) {
#!/usr/bin/perl
use strict;
use warnings;

my $data = "int& myClass::Function1();\n"
         . "void * me::function2(const int& temp, double a, char[] b);\n"
         . "double** class::function_3 (int[] array, int& result);\n";

while ($data =~ /\s*(\w+([\s&\*]*))((::)?((\w+)::)?(\w+)\s*\(([^)]*)\)\s*;)/gs ) {
    my $return_type = $1;
    my $class = $6;
    my $function_name = $7;
    my $arguments = $8;
    print "return_type   = $return_type\n";
    print "class         = $class\n";
    print "function_name = $function_name\n";
    print "arguments     = $arguments\n";
}
正如您所看到的,这个regexp已经相当复杂了,仍然有很多情况是它无法捕获的(名称空间、模板、每行可能带有参数+注释的多行函数等等)。如果您确实想这样做,请尝试基于测试的方法:

  • 分析数据的格式,即要考虑的函数名(例如:它们使用命名空间吗?它们返回引用、指针等吗?在这种情况下,它们之间是否有空格?)
  • 创建一个测试套件,即一个名为function1、function2、function3的函数列表……确保每个可能的语法都有一个用例(这是最难的部分,因为您如何确保已经考虑了所有这些呢?)
  • 编写一个覆盖尽可能多的案例的ReXEP。如果你不能用一个覆盖所有的例子,考虑使用不止一个(在我给出的例子中,<<>代码> 循环)。每次你有一个匹配,打印它。最后,检查你已经找到了测试中的所有函数。
  • 如果你能做到这一切,如果你在定义测试用例方面做得很好,你就可以成功。但是让我重复一次,正则表达式不是实现这一点的合适工具,它们只在有限的一组用例中工作,甚至确定它们是否在你的用例中工作也很困难


    再次:考虑解析器!

    是的,这太复杂了。我尝试了很多方法,一个URR,无论如何,谢谢: