0

単語を一致させようとしていますが、前にコメントが付いている場合は一致し/*ません (後にはありません*/)。これまでのところ、これを達成するために否定的な先読みアサーションを使用しようとしましたが、うまくいきませんでした。これは、否定的な先読みまたは否定的な後読みアサーションで可能になるのでしょうか、それとも無駄な努力でしょうか?

4

1 に答える 1

1

Perl スクリプトを書いて、C コードを分析しようとしているだけだと思います。

それを行うのは、単一のエレガントな正規表現かもしれませんが、ファイル全体を読み取って単一の文字列にする必要があります。複数の行 (文字) を含む文字列に対して Perl 正規表現を実行しようとしたときに問題が発生したことを覚えていますが\n、それは私だけかもしれません。

とにかく、次の 3 つのケースに注意して、1 行ずつ処理することをお勧めします。

  1. 一行コメント:/* my comment */
  2. 現在の行から始まるコメント:/* my comment starts here
  3. 現在の行で終了するコメント: my comment ends here */

分析中のテキストからコメントを削除し、残りの単語を検索します。このようなもの:

#!/usr/bin/perl
use strict;
use warnings;

my $word = shift;
my $line_no = 0;
my $whole_line = "";

my $in_comment = 0;

sub word_detection
{
    while ($_ =~ /\b($word)\b/g)
    {
        print "'$1' found on line $line_no: $whole_line\n";
    }
}

while (<>)
{
    chomp;
    $whole_line = $_;
    $line_no ++;

    $_ =~ s/\/\*.*?\*\///;

    if ($_ =~ /\/\*/)
    {
        my @split = (split /\/\*/,  $_);
        $_ = $split[0];
        $in_comment = 1;
        word_detection $_;
    }
    elsif ($_ =~ /\*\//)
    {
        my @split = (split /\*\//,  $_);
        $_ = $split[1];
        $in_comment = 0;
        word_detection $_;
    }
    elsif (not $in_comment)
    {
        word_detection $_;
    }
}

このスクリプトを最初の引数 (以下の例では「int」) として単語を指定し、次にファイル名を指定して実行します。それは仕事をするべきです:

$ match-word int test.cc
'int' found on line 11: int /* comment on one line */ x = 10;
'int' found on line 13: int y; /* and this is
'int' found on line 15:     comment */ int z;
'int' found on line 17: int main(int argc, char* argv[])
'int' found on line 17: int main(int argc, char* argv[])
于 2012-06-30T06:50:19.067 に答える