我需要创建一个函数指针文件。我正在使用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',我回溯到单词的开头并添加(*。 我发现很难将其转换为代码。 请提出同样的建议。目前我正在使用每个数据类型的正则表达式并添加添加(*到它,这是一个非常漫长的过程。
提前致谢
答案 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);