ドキュメントジェネレータ doclink 設計メモ 2019.01.26 長谷川啓
プリプロセッサから受け取る情報 struct macro_t { }; vector<macro_t> macros; string m_name; // マクロ名 file_t m_def; // 定義位置 vector<file_t> m_refed; // 参照位置 }; vector<macro_t> macros; マクロ定義は同一ヘッダーに書けば複数の入力ファイルで重複する その場合は参照位置のみが増大する 稀に同一のマクロ名が異なるファイルで定義されることもある
docgen.dll から受け取る情報(1) 構造体等 struct tag_t { }; string m_name; // タグ名 file_t m_decl; // 宣言位置 vector<pair<string, file_t> > m_refed; // 参照位置 (函数名) }; vector<tag_t> tags; マクロと異なる点 多重定義はエラー コンパイラフロントエンドによりエラーになる doclink でのこのエラーの扱いは実装におまかせ
docgen.dll から受け取る情報(2) Typedef 名 struct type_t { }; string m_name; // typedef 名 file_t m_def; // 定義位置 vector<file_t> m_refed; // 参照位置 }; vector<type_t> types; 構造体等と異なる点 参照位置 ファイル名と行番号のみ
docgen.dll から受け取る情報(3) 変数 struct var_t { }; vector<var_t> vars; string m_name; // 変数名 file_t m_def; // 定義位置 vector<file_t> m_decls; // 宣言位置 vector<pair<string, file_t> > m_refed; // 参照位置(函数名, 変数名) }; vector<var_t> vars; マクロや構造体等と異なる点 宣言位置がある 宣言が先行し、定義が後にくることが一般的だが、定義が先のこともある。 多重定義はエラー リンカーによりエラーになるが、doclink で検出することも可能
docgen.dll から受け取る情報(4) 函数 struct func_t { }; string m_name; // 変数名 file_t m_def; // 定義位置 vector<file_t> m_decls; // 宣言位置 vector<pair<string, file_t> > m_refed; // 参照位置(函数名, 変数名) vector<pair<string, file_t> > m_call; // 呼び出し vector<pair<int, file_t> > m_vertices; // グラフの頂点 vector<pair<int,int> > m_edges; // グラフの辺 }; vector<func_t> funcs; 変数と異なる点 グラフ
定義やコメント doclink に渡されるのは名前、ファイル名、行番号のみ プログラムテキストをどのように拾うかは doclink 依存
ドキュメントのテキスト テキストのフォントは固定の等幅フォントを仮定する(簡単のため) テキストの占める領域 文字列 フォント 出力する文書の種類 から決定される
マクロ、構造体等、Typedef 名、変数、函数の流れグラフ以外 表は TeX の tabular 環境を使うと比較的簡単
函数の流れグラフ TeX の picture 環境でまずは実現 300 × 550 pt の領域 基本ブロックは 1 ページ当たり 6 個 基本ブロックの配置 基本ブロックの番号によってのみ決まる
相関図 struct tree { }; vector<tree*> result; string m_text; // テキスト(函数名) pair<int, int> m_point; // テキストの座標 enum box_t { NONE, UNDER, DASH, FRAME } m_box; // 枠 vector<tree*> m_children; }; vector<tree*> result; calc(result); // ページに収まるように(独自の)座標を計算 for (auto& t : result) conv(t); // 例えば TeX の座標に変換 for (const auto& t : figs) draw(t); // ここでは計算結果を出力するだけにする
相関図(2) 座標変換の意味 いきなり出力することができない これは TeX の座標系の左上が (0,0) でも同じこと \begin{picture}(300,550)(0,0) ^^^^^^^^ そもそもここが不明 \put(0, 550){\framebox{main}} ^^^ ここも不明 ... \end{picture} これは TeX の座標系の左上が (0,0) でも同じこと