推しミネラルウォーターはありますか?

C言語のソースコードを扱っています。
デバッグのため(関数がどういう順番で呼び出されているかを知るため)、関数の先頭にprint文をつけようと思っています。
例えば、

int hoge(引数の並び)

関数の中身


なら

int hoge(引数の並び)

printf("hoge");
関数の中身

といった具合です。
関数が膨大なので、手作業で一つずつprintfを書くのは現実的ではありません。

関数の最初の1行のパターンマッチは、/int\s\w*(.*)/
でうまくいくのですが、次の行の{まで含んだ正規表現に対応させるやり方がわかりません。
また、printf文を読み込んだソースコードに挿入するにはどうしたらよいのでしょうか。
どなたか分かる方がいらしたらご教授よろしくお願いいたします。

A 回答 (4件)

2行単位で処理するようなループを書けば、正規表現マッチが簡単になると思います。



my $twoline = <FH>;

while (<FH>) {
$twoline .= $_;
$twoline .= "printf(\"hoge\");\n" if $twoline =~ /int\s\w*\(.*\)\s*\n\s*\{\s*\n/;
my ($line1, $line2) = $twoline =~ /^(.*\n)(.*\n)$/s;
print $line1;
$twoline = $line2;
}

print $twoline;
    • good
    • 0
この回答へのお礼

解答ありがとうございます。2行単位でやってみます。

お礼日時:2011/08/23 14:04

複数行マッチングはmオプションを付ければ可能です。


具体的には、
/int\s\w+(.*)/m
のようにすればOKです。
注意点としては、複数行マッチングの時、任意の一文字を表す「.」はそのままでは改行にはマッチしません。
sオプションを付ければマッチするようになります。
perlの正規表現は結構複雑な仕様なので、リファレンスを一読されることをお勧めします。
    • good
    • 0
この回答へのお礼

解答ありがとうございます。
正規表現はたしかに複雑ですね。

お礼日時:2011/08/23 14:03

「全体を読み込む」は「全体を読み込む」以外の表現が難しいんだけどなぁ.... 強いて言い換えれば「ファイル全体を 1つの文字列として読み込む」... ぜんぜん変わらん.



で「よろしく」ってのは「やりたいように」ってこと. 例えば「改行の直後の {」は
/\n\{/
でマッチできる.
    • good
    • 0
この回答へのお礼

ありがとうございます。ファイル全体を読み込むこともできるのですね。

お礼日時:2011/08/23 14:02

えぇと....


/int\s\w*(.*)/
という正規表現だと, int 型の変数の宣言にもマッチするはずなのですが....

あと, int 以外 (void を含む) を返す関数で破綻するね.

どこまでまじめに処理するかにもよるんだけど, 手を抜くなら
$/ = undef;
$file = <>;
で全体を一気に読み込んでからよろしくする.
    • good
    • 0
この回答へのお礼

解答ありがとうございます。

>あと, int 以外 (void を含む) を返す関数で破綻するね.

ここは、適宜置き換えるので問題ありません。

>どこまでまじめに処理するかにもよるんだけど, 手を抜くなら
$/ = undef;
$file = <>;
で全体を一気に読み込んでからよろしくする.

すいませんが、もう少し詳しく説明してくれませんか。「全体を読み込む」とか「よろしくする」ではわかりませんでした。
よろしくお願いいたします。

お礼日時:2011/08/22 23:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報