【问题标题】:Matching functions using Perl使用 Perl 匹配函数
【发布时间】:2014-07-31 06:18:25
【问题描述】:

我有一个包含许多函数的文件,如下所示,其中包含参数。我想打印该函数的开始'{'到结束'}'的行号。对于所有其他功能,依此类推。

我尝试了什么:

 #!/usr/bin/perl

 format EMPLOYEE =
 @<<<<<<<<<<<<<<<<<<<<<<<<<<<< @####            @####
 $func $start $end
 =======================================================
.

format EMPLOYEE_TOP =
 =======================================================
 Function                        Start            End
 =======================================================
.

select(STDOUT);
$~ = EMPLOYEE;
$^ = EMPLOYEE_TOP;

open(FILE, "<input.txt" );
while(<FILE>){
if(/^static/){
chomp;
$cols = (split(/ /))[2];
$func=$cols;
}
}
close FILE;

open(FILE, "<input.txt" );
$line;
$count = 0;
@key1=qw(static);
@key2=qw(return\sfailed);
while($line = <FILE> )
{
$count++;
foreach $k (@key1) 
{
    if ( $line =~ m/$k/ ) 
    {
          $start=$count;
          last;
    }
} 
foreach $k (@key2) 
{
  $r=0;  
    if ( $line =~ m/$k/ ) 
    {              
          last;
    }
    $end=$r+$count;
}
}
close FILE;
write;

文件中的示例代码:

1.static int function1 (...,...,...,some arguments,..,..)
{
statements//
also has loops//
statements//
234. }
235.static int function2 (...,...,...,some arguments,..,..)
{
statements//
also has loops//
statements//
339. 
}

输出应该是:

1 and 234 for function1.
235 and 339 for funciton2.

【问题讨论】:

  • 你看过MarpaX::Languages::C::AST吗?这是一个完整的 C 编程语言解析器,它从 C 源代码构建抽象语法树。完成此操作后,我想在 AST 中查询每个函数声明的行号非常容易。

标签: regex perl


【解决方案1】:

{ {} {} } 嵌套:需要递归

这将是最棘手的,但我会给你一些尝试。

函数分隔符

首先我们需要知道一个函数是如何启动的。我们可以采取什么作为分隔符?例如,static int 总是在函数定义之前存在吗?是否可以保证static int 的每个实例都位于定义之前?

您很可能会有多个分隔符。我们将从一个开始,然后将它们添加到列表中。

递归正则表达式

假设 static int 是一个正确的分隔符,并且是唯一的——我们知道这可能不是这种情况,但我们可以稍后将分隔符添加到正则表达式中——我们可以使用递归正则表达式来处理嵌套的大括号:

static int [^{]*\K({(?:[^{}]++|(?1))*})

Perl 单行器

也许不是最优化的代码,但这让您有机会尝试该模式:

perl -0777 -ne 'while(m/static int [^{]*\K({(?:[^{}]++|(?1))*})/g){print "$&\n";}' yourfile

试一试,然后看看我们是否能够调整。

【讨论】:

  • 感谢您的回复。 Static int 可能并非在所有情况下都存在。它可能会改变。我猜从代码的第一行开始,它应该标识一个函数,然后是函数的 { 和 }。
猜你喜欢
  • 1970-01-01
  • 2015-10-25
  • 2012-03-29
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多