C++ スタイルのコメントを除去

JavaScript のコメントは C++ と同じようなスタイルなんですが,// や /*〜*/ を単純に正規表現で除去しようとすると,クォーテーションされた文字列リテラル内にコメントを含んでいる場合にうまくいきません。

んで,苦し紛れに考えたコード。

my $text = shift;

my $cppcom = qq{ //   .*? \\n  };
my $c__com = qq{ /\\* .*? \\*/ };

my $dquot = qq{ " (?: \\\\\\\\ | \\\\. | [^\\\\"]+ )* " };
my $squot = qq{ ' (?: \\\\\\\\ | \\\\. | [^\\\\']+ )* ' };

my @tokens
    = split qr{ ( $cppcom | $c__com | $dquot | $squot ) }xmso, $text;

my $f = 0;
foreach my $token (@tokens) {
    if (! $f) {
        $token =~ s/ \s+ / /gxmso;
    }
    elsif ($token =~ m' \A /[/*] 'xmso) {
        $token = q{};
    }
    $f = 1 - $f;
}

return join q{}, @tokens;

コメントを除去しつつ余分なスペース/タブ/改行を畳むようにしてます。

これでほんとに等価なのかしらん。我ながらスマートなコードじゃないし!そもそもコード中に正規表現リテラルがある場合を考慮してないし!

クォーテーション内の正規表現が間違ってたのでなおしました。