1

私は課題を扱っていますが、Perlは本当に初めてです。よくわからない。これらの3種類のファイル(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}に対して何をすべきかを確認します。

よろしくEhsan

4

2 に答える 2

2

Regexp::Common は正規表現を提供していないため、自分で行う必要があります。可能なフォーマットの数が多いため、これは非常に複雑です。たとえば、C では、次のように検索します。

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

しかし、考えられる型 (インクルード ファイルの typedef) をすべて知っているとは限りません。オプションの空白とコメントの間、古いスタイルの関数定義は言うまでもなく、すべてのケースを把握するのは難しい場合があります。

結局のところ、C 用の字句解析プログラムを作成するのは実際には非常に困難であり、多くのインクルード ファイルが含まれている可能性がある typedef などのことを知らず、プリプロセッサ全体を実装していない場合は、さらに困難になります。あなたの場合には当てはまらない一般的な例は です(A)*B。これは、typedef のすべてのインクルードをチェックせずに、乗算またはスカラー逆参照の型キャストであるかどうかを判断できません。

于 2012-09-29T02:25:52.333 に答える
2

2 つの基本的なアプローチがあります。既存のパーサーを使用するか、コンパイラを使用して必要な情報を提供します。

C の場合、C (および多くの C++) から関数宣言 (およびその他) を取得するC::Scanがあります。または、必要な情報を提供するためにgccを入手できる場合もあります。

Javaに関しては、それはより困難です。1 つの可能性は、 Inline::Javaがそれを行う方法を理解することです。または、 Eclipse のパーサーを使用してみてください。

既存の「十分な」正規表現をマイニングする可能性は、TextMateまたは構文の強調表示を行う他のエディターからのものです。TextMate について言及するのは、その言語解析が最も理解しやすいと思うからです。おそらく、必要な正規表現の Java バンドルをマイニングできます。

これが単なる正規表現の演習である場合、教訓は、この種のことは正規表現には複雑すぎるということです。言語の場合、文法とその文法のパーサーが必要です。

于 2012-09-29T02:44:52.933 に答える