0

C ソース ファイルの関数呼び出しを抽出することは可能ですか。

...
myfunc(1);
...

また

...
myfunc(anotherfunc(1, 2));
....  

Rubyの正規表現だけで?そうでない場合、ANTLR などのパーサー ジェネレーターは役に立ちますか?

4

3 に答える 3

0

これは、メソッド呼び出しを見つけるための完全なパターンではありませんが、関心のあるパターンを提供するだけです。

[a-zA-Z\s]*\([a-zA-Z0-9]*(\([a-zA-Z0-9\s]*[\s,]*[\sa-zA-Z0-9]*\))?\);

この正規表現は、次のメソッド呼び出しパターンに一致します。

1. myfunc(another(one,two));
2. myfunc();
3. myfunc(another());
4. myfunc(oneArg);
于 2012-07-23T12:39:35.907 に答える
0

emacs で使用されている文法からすでに書かれている正規表現 ( imenu 、 etags、ecb、c-mode など) を使用することもできます。

于 2012-07-23T12:44:45.540 に答える
0

関数呼び出しを再帰的にネストする可能性があるため、非正規言語になるため、最も純粋な意味ではできません。つまり、任意の関数呼び出しに一致し、含まれているすべての関数名を抽出する正規表現を作成することはできません。

しかしもちろん、関数名で許可されている文字のシーケンス (つまり、文字またはアンダースコアで始まり、その後に文字、アンダースコア、数字などが続く必要があります...) をインクリメンタルに検索することもできます。行。

ただし、そのようなアプローチはエラーが発生しやすいことに注意してください。関数がコメントで参照されている場合はどうなるでしょうか。文字列定数内に表示された場合はどうなりますか? 本当に、すべての特殊なケースをキャッチするには、完全な C ファイルを (ほぼ) 適切に解析する必要があります。

最近のほとんどの正規表現エンジンには、部分式への後方参照など、通常の言語よりも多くの構文を解析する機能があります。しかし、その道を進んではいけません。コンテキストフリー言語を解析できる ANTLR などの適切なパーサーを使用すると、自分の生活がずっと楽になります。

于 2012-07-24T02:02:30.883 に答える