2012年3月19日月曜日

Adlintを読む その4

その3で読んだsingle_module_phasesの中身に入っていく。

最初に実行されるのはcpp/phrase.rbに書かれているCpp::ParsePhrase。contextハッシュに、処理内容をひたすら積んでいってる。
積まれた処理は、次のCpp::EvalPhaseでシステム固有の.h、プロジェクト固有の.h、そして.cへと順に適用される。

各処理は、それぞれ次の順番で処理される。まずPreprocessedSourceで結果のソースファイルを用意し、Preprocesserがプリプロセス処理を実行していく。処理途中に定義されたマクロは、Cpp::MacroTableに格納されていく。

ざっと読む限り、まっとうにCのプリプロセッサをRubyで実装しているようだ。ここだけ切り出したいって要求もあると思う。レガシーなソースだと、#ifdefの嵐でどこが有効か判らなくなることもあって、マクロ展開をせず#ifdefだけ処理するカスタム版のプリプロセッサが欲しいこともあるからだ。時間があったらそっちもトライしてみたい。

0 件のコメント:

コメントを投稿