使用perl函数声明到函数指针声明

时间:2012-03-01 12:16:52

标签: regex perl

我需要创建一个函数指针文件。我正在使用perl。 我的输入是一个函数声明列表。以下是一些例子:

1

char * cc_Hightor_ind(Closed* p_Closed);
  to 
char * (*cc_Hightor_ind)(Closed* p_Closed);

2

char cc_Hightor_ind(Closed* p_Closed);
   to 
char (*cc_Hightor_ind)(Closed* p_Closed);

这些是函数返回指针和值的两种常见情况。 我无法解决如何转换函数名称前面的(*。

我的逻辑是找到'_ind',我回溯到单词的开头并添加(*。 我发现很难将其转换为代码。 请提出同样的建议。目前我正在使用每个数据类型的正则表达式并添加添加(*到它,这是一个非常漫长的过程。

提前致谢

4 个答案:

答案 0 :(得分:2)

类似于使用正则表达式处理XML,除非您涉及正确的C解析器,否则它永远不会 100%正确。但是你可以编写一些对于大多数常见情况都是正确的东西,并且可能总是对于给定的C代码样本是正确的 - 特别是如果该代码是自动生成的。

尝试初始尝试,其中包括您发布的两个代码示例。如果您希望我们为您提供更多帮助,请发布您正在处理的内容的全面示例

use strict;
use warnings;

while (<DATA>) {
  chomp;
  (my $ptr = $_) =~ s/( \w+ \s* )\(/(*$1)(/x ;
  print $ptr, "\n";
}

__DATA__
char * cc_Hightor_ind(Closed* p_Closed);
char cc_Hightor_ind(Closed* p_Closed);

<强>输出

char * (*cc_Hightor_ind)(Closed* p_Closed);
char (*cc_Hightor_ind)(Closed* p_Closed);

答案 1 :(得分:1)

根据更新的问题更新:

while(<DATA>) {
    chomp;
    s/(\*?\s+)(\w+\s*\()/$1(*$2)/;
    say;
}
__DATA__
char * cc_Hightor_ind(Closed* p_Closed);
char cc_Hightor_ind(Closed* p_Closed);

<强>输出:

char * (*cc_Hightor_ind)(Closed* p_Closed);
char (*cc_Hightor_ind)(Closed* p_Closed);

答案 2 :(得分:1)

抱歉,我没有时间获得完整的答案,但这里有一些关于在Perl中解析C的讨论。 http://www.perlmonks.org/?node_id=746341也许它可以给你一些想法。

答案 3 :(得分:0)

我已经达成了以下几轮解决方案: - (

my $line  = "char * cc_Hightor_ind(Closed* p_Closed);";
# split with white-space as delimiter
my @splt = split (/\s/, $line);
$count = split(/\s/, $line);
#traverse through tokens
for ($i = 0; $i < $count; $i++) {
  # If token has '_ind', then prepend '(*' and append ')' to it
  if ((@splt[$i] =~ s/_ind/_ind\)/)) {

    @splt[$i] = "\(* @splt[$i]\) ";

  }
}

    $line = join (" ", @splt);
    print "$line\n";

 #sample output
 #D:\gsa\mytries\prl>getFptr.pl
 #char * (* cc_Hightor_ind(Closed* p_Closed);