電子書籍の厳選無料作品が豊富!

findstrの正規表現を使ってC/C++の関数名を取得したいです。
どのようにしたらよいのでしょうか?
途中までは以下かなと思っていますが、最後の「)」の記述をどうすればよいのか分かりません。
 ^[a-zA-Z][a-zA-Z0-9].*

関数は以下のように3パターン書かれています。
int hoge(void) { return hoge; }

void hoge(int hoge)
{
}

void hoge( int hoge1
      int hoge2
      int hoge3
     )
{
}

すみませんがどなかたご教授ください。

A 回答 (6件)

No1、4です。


findstr /r /c:"^[A-Za-z_][A-Za-z_0-9]* [A-Za-z_][A-Za-z_0-9]*("
と、/r /c: オプションをつけることで空白も使えました。
    • good
    • 1
この回答へのお礼

解決しました

ご回答ありがとうございます。
ご指摘のとおり”(”ですね。失礼しました。

結果ですが、だめでした。
最後の”(”を無くすと、ファイル先頭の方ににある、
変数や関数宣言も検出しちゃいましたが、
目的の関数は漏れなく検出していますので、使わせていただきます。
ありがとうございました。

お礼日時:2015/07/27 23:32

どの程度の精度で考えてますか?



完全なものは正規表現では無理です。
下記のようなケースについて
「検出できなくてもいい/絶対検出したい」
「関数名で無いものを誤検出してもいい/誤検出は困る」
「検出できるようにC++のソースを書き換えるからいい/書き換えないで対応したい」
等を考え、それに合せた方法(他のツールを使う、等も含める)を使います。


C++ では、ただの改行と空白は同じ扱いなので
int hoge(int hoge1){}

int
hoge
(
int
hoge1
)
{
}
とは同じです。
前者で統一されていれば、正規表現である程度の精度で検索できますが、後者の場合は(findstrでは)無理です。
※ たしか、複数行にわたる検索に対応していなかったはず


classHoge hoge(Fuga) ;
は、文脈によって
・classHoge型変数 hoge の宣言 。コンストラクタの引数に Fuga を指定
・classHoge型関数 hoge のプロトタイプ宣言 。引数に Fuga型
と違う解釈ができます。単純に文字列だけを見るfindstrでは、分別不可能です。


関数宣言文で検索するなら、名前に :: が含まれるケースを考慮する必要があるでしょう。
namespaceHoge::classHoge namespaceHoge::classHoge::hoge(namespaceFuga::classFuga fuga1){}
厳密にやるなら、 :: と連続していることを調べる必要があります。
文法チェックはコンパイラにまかせるなら、 : を「関数名に使える文字」として扱うという方法があります。


_ (アンダースコア) は関数名に使えます。
先頭にも使えます。
但し、先頭に使うと予約名になってしまう場合があるので、自作部分での使用は避けた方がよいでしょう。
https://msdn.microsoft.com/ja-jp/library/Cc44018 …
「予約名の形式」
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
不足はNGですが、余計に検出はOKです。

一手間いりますが、artoo(No5)さん案でいけそうです。

お礼日時:2015/07/27 23:40

>関数名といえば「int hoge(void)」の内、hogeになると思っていました。


それで正しいのですが、質問文中に書かれている書きかけ正規表現では、それが行頭にあるものを探そうとしているようなので、???となってしまいました。
で、探すときには「英字で始まり英数字が続くものに(が後続するもの」かと思ったのですが、最後の「)」という記述もあり、これも???となってしまいました。

(行頭)型名(空白) 関数名(
を探すとすると、findstr "^[A-Za-z_][A-Za-z_0-9]* [A-Za-z_][A-Za-z_0-9]*(" でいいかと思ったのですが、findstr は空白は「または」の意味になるのでこれでは駄目です。実用的には、空白の代わりに「.」を指定して、
findstr "^[A-Za-z_][A-Za-z_0-9]*.[A-Za-z_][A-Za-z_0-9]*("
でどうでしょうか。空白が複数個というケースもあるのなら、「.*」と書かざるを得ず、他の物も引っかかりそうですが、コーディングルールで質問文中の3パターンしか無いと言うことであれば大丈夫ですね。
    • good
    • 0

ねんのため指摘しておくと, 本来これは「正規表現」ではどうにもなりません. 例えば


int foo(int bar(int baz(int x), int x), int baz(int x))
なんてわけのわからんことをされると難しい.

まあ, こんなのは書く方もどうかしてるとは思うけど.
    • good
    • 0
この回答へのお礼

そうですね。さすがに記載のコードはないかな・・・

お礼日時:2015/07/27 23:12

スペースとか改行を無視すればこの3パターンを抽出するだけであれば



単語 = [a-zA-Z_][a-zA-Z_0-9]*
引数 = 単語(,単語)*

として

関数 = ^単語(単語)\(引数?\)\{

こんな感じでしょうか

実際にはテンプレートとかラムダ式とかがあるので、もう少し難しいです
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
まずは、.cppファイルから関数名を抽出するのが目的ですので、ご記載の内容で試してみますね。

#「_」から始まる関数もあるのですね。。。。

お礼日時:2015/07/25 23:30

関数名というのが何を指しているか質問文だけではよく分かりません。

正規表現で表現したい物を、日本語でいいので正確に書いてみてください。
    • good
    • 0
この回答へのお礼

すみません。かけだしなもので、関数名といえば「int hoge(void)」の内、
hogeになると思っていました。
intは戻り値で、()内は引数という認識です。

お礼日時:2015/07/25 23:36

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