◀ANSI版開発トップへ
  • 4522 関数一覧の作り方
    • 4523 Re: C/C++の関数一覧の作り方
  • [4522] 関数一覧の作り方 げんた 2006年07月16日 06:30

    >>data:5345 のGuiYMさんからのRequestがあったので,関数一覧の作り方について

    うまく書けたら,後からホームページにまとめよう.

    関数の場所: CEditDoc.cpp
    CEditDoc::MakeFuncList_***** という関数群です.

    EditDocの持つデータを先頭から読んで,引数pcFuncInfoArrに解析結果を格納します.
    返されるデータレコード1つ分はCFuncInfo型で,
    行番号,関数名,付加情報,深さ を持ちます.

    そのデータを元に,CDlgFuncListクラス (CDlgFuncList.cpp) にて再度表示用に加工してツリーまたはリスト形式でダイアログボックスに表示します.

    [改善したほうが良いと思われる点]
    関数個別の処理がCEditDocの関数とCDlgFuncListの2つに分離されている.種別毎に1つのクラスを設けて,処理を1カ所にまとめた方がよい.そうすることで追加が容易になり,解析のPlug-in化も可能になるかも.

    それぞれの関数は手作りだが,lexerを使うことでもうちょっとスマートに作れるかも.
    • [4523] Re: C/C++の関数一覧の作り方 げんた 2006年07月16日 06:50

      その前に前の記事の訂正.
      MakeFuncList_*** 以外に MakeTopicList_*** というのもあります.
      あと,MakeFuncList_***はCEditDoc_***.cpp という別のファイルにもあって,特にCはCEditDoc_FuncList1.cppという専用のファイルに入っています.

      文法が複雑なC++の解析のために中身はかなり複雑になっています.またヘッダファイルを読み込まないので,こんなパターンは関数だろうというヒューリスティックな手法も使っています.
      最初に#ifdef-elseのプリプロセッサ解析を行います.プリプロセッサによって削除される部分はこの時点で空行に変換されます.
      そこで残った行を順番に見ていきます.やっていることを一言で言えば状態遷移表を出現文字によってたどっていき,必要な文字列を保存して後で使います.

      nMode, nMode2といった変数がありますが,この中に入っている値が現在の状態です.値の意味は一応書いてありますが,詳しく知りたいなら実際にステップ実行してみてください.

      ネームスペース,クラスや{}のネストは配列をスタックとして使います.

      ---
      他に具体的に知りたい点があればまた質問してください.