C++ 要获取由perl在多个c、cpp或.h文件中定义的函数名吗
c、cpp和.h的文件语法示例 cpp文件C++ 要获取由perl在多个c、cpp或.h文件中定义的函数名吗,c++,c,regex,perl,C++,C,Regex,Perl,c、cpp和.h的文件语法示例 cpp文件 {< //-------------------------------------------------------------------------------------------- // FORWARD DECLARATION //-------------------------------------------------------------------------------------------- Result_
{< //--------------------------------------------------------------------------------------------
// 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,无论如何,谢谢: