2012-09-29 37 views
1

我正在處理一項任務,而我對Perl真的很陌生。不太瞭解它。 你們可以指導我提取這三種文件(C,C++和Java)的註釋和函數名嗎?我如何從C++或C或Java中提取註釋和函數名與Perl

我已經嘗試過這樣的:

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做評論} {}的Java

問候 伊赫桑

+1

你嘗試過什麼嗎?分享給我們 – Serge

+1

你在做什麼的目的是什麼?這只是一個練習,還是你正在用這些信息解決問題?如果你讓我們知道最終目標,我們可能會找到一個更簡單的方法來做到這一點。 – Schwern

+0

這是一個練習,但因爲我是一個研究生,所以它會以某種方式解決調查問題:) – Ehsan

回答

2

正則表達式::常見不爲它提供一個正則表達式,所以你必須做你自己。由於可能的格式數量,這是非常複雜的。在C語言中,例如,你要搜索:

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

但你不一定知道每一個可能的類型(包括文件類型定義),以及可選的空白和評論之間,更何況OLD-風格的函數定義,可能很難抓住每一個案例。

事實證明,爲C編寫一個詞法分析器實際上非常困難,而且當你不知道類型定義等很多東西時可能會更困難,這可能是許多深層包含文件以及未實現整個預處理器的情況。常見的例子,不適用於你的情況,是(A)*B,你不知道它是一個乘法或是一個標量解引用的類型轉換,而不檢查typedefs的所有包含。

2

有兩種基本方法:使用預先存在的解析器或使用編譯器爲您提供所需的信息。

對於C,有C::Scan從C(以及很多C++)獲取函數聲明(以及更多)。或者你也許能夠得到gcc給你你想要的信息。

至於Java,這很難。一種可能性是弄清楚Inline::Java是如何做到的。或者,您可以嘗試使用the parser from Eclipse

挖掘現有的「足夠好」正則表達式的可能性來自TextMate或其他編輯器,它們進行語法高亮顯示。我提到TextMate是因爲我覺得它的語言解析是最容易理解的。您可能可以挖掘他們的Java捆綁包以獲取必要的正則表達式。

如果這只是一個正則表達式練習,那麼對於正則表達式來說,這樣的事情太複雜了。對於語言,您需要語法和語法分析器。

相關問題