如何使用perl从C ++或C或Java中提取注释和函数名称

时间:2012-09-29 01:31:21

标签: perl

我正在处理一项任务,而且我是Perl的新手。不太了解它。 你能指导我提取这三种文件(C,C ++和Java)的注释和函数名吗?

我已经尝试过这个:

use strict;
use warnings;
use File::Basename;
use File::Find;
use File::Slurp;
use Regexp::Common qw /comment/;
    my $fileName = "a.java";
    my $wordsIn = "";
    my $wordsIdentifier="";
    my $numRemoved = 0;

    #$wordsOut = `xscc.awk extract=comment prune=copyright $fileName`;
    $wordsIn = read_file($fileName) ;
    # Find all matches of comments, and put them into @arr
    my @arr = $wordsIn =~  m/$RE{comment}{Java}/g;
    my $wordsOut = join(" ", @arr);
    print "Comments:\n";
    print $wordsOut;
    $wordsIn =~ s/$RE{comment}{Java}//g;
    print "Identifiers:\n";
    print $wordsIn;

它完全得到了评论(即使我不知道如何!),但是对于检索标识符和方法名称,我应该为$ RE {comment} {Java}

做些什么

此致 伊赫桑

2 个答案:

答案 0 :(得分:2)

Regexp :: Common不提供正则表达式,所以你必须自己做。由于可能的格式数量,这非常复杂。例如,在C中,您需要搜索:

<type> <identifier - save this> (<comma-separated list of types and identifiers>)
{

但是您不一定知道每种可能的类型(包含文件中的typedef),以及可选的空格和注释之间,更不用说旧式函数定义,可能很难捕捉到每种情况。

事实证明,为C编写一个词法分析器实际上非常困难,而当你不知道诸如typedef之类的东西可能很多包含深度文件以及你没有实现整个预处理器时更难。在您的情况下不适用的常见示例是(A)*B,如果没有检查typedef的所有包含,则无法判断它是否是标量解除引用的乘法或类型转换。

答案 1 :(得分:2)

有两种基本方法:使用预先存在的解析器或使用编译器为您提供所需的信息。

对于C,有C::Scan从C(以及许多C ++)获取函数声明(以及更多)。或者您也可以gcc向您提供所需的信息。

至于Java,那就更难了。一种可能性是弄清Inline::Java如何做到这一点。或者,您可以尝试使用the parser from Eclipse

挖掘现有“足够好”的正则表达式的可能性来自TextMate或其他进行语法突出显示的编辑器。我提到TextMate,因为我发现它的语言解析是最容易理解的。您可以挖掘他们的Java包以获得必要的正则表达式。

如果这只是一个正则表达式练习,那么教训是这种事情对于正则表达式来说太复杂了。对于语言,您需要语法和该语法的解析器。