Meta/Multi Line Preprocessor

えーと、 cpp のかわりに m4 を使いたいとZinniaさんさんがおっしゃっていて、その辺の議論で出てきた妄想なのですが面白そうなので作ってみました。

http://shinh.skr.jp/mlpp/mlpp.tar.bz2

えーと、これは何かというと、メタプリプロセッサです。別なプリプロセッサを使ってプリプロセスするプリプロセッサなのでメタプリプロセッサです。

私は Java の表現力の無さにがっかりして eruby でプリプロセスしたりしてるような人間なのですが (http://d.hatena.ne.jp/shinichiro_h/20040308#p1)、これ、行番号を一致させるのが一苦労なのです。というわけで作った行番号合わせ装置がこれです。

詳しいドキュメント書いてる場合でも無いので詳細はまた今度。 mlpp.yml に色々設定が書いてあります。 build.sh が実行例です。 build.sh の実行例について説明していきます。

./mlpp.rb -o test_cpp test_cpp.c cpp gcc - -g

mlpp は三引数を必要とします。コンパイルしたいファイル、使うプリプセッサ、使うコンパイラ、です。 -o オプションでファイルの出力先を指定できます。 - 単体の後のオプションはコンパイラに渡されます。

./mlpp.rb -o test_m4 test_m4.c m4 gcc - -g
./mlpp.rb -o test_eruby test_eruby.c eruby gcc - -g

現状、プリプロセッサとしては cpp, m4, eruby をサポートしています。

./mlpp.rb -o test_eruby_d test_eruby.d eruby dmd - -g

コンパイラとしては gcc, dmd, java, cat をサポートしています。プリプロセスだけをしたいときは cat を指定します。

./mlpp.rb test_eruby.java eruby javac
./mlpp.rb test_eruby_error.java eruby javac

ここまでの言語は #line 10 "hoge.c" などとするとファイル名・行番号を指定できたのですが、たぶん Java はできません、よね? Java の場合、コンパイラの出力を横取りしてその行番号を修正して出力します。 test_eruby_error.java はエラーが出るはずですが、この行番号は正しく修正されています。

./mlpp.rb -l test_eruby_exception.java eruby javac
./mlppfilt.rb java test_eruby_exception

-l オプションで行番号補正情報を .test_eruby_exception.lines に保存できます。これは、 Java 実行時の例外の行番号情報修正に使用します。 mlppfilt.rb がそのコマンドで、同じディレクトリの .*.lines ファイルを全て読み込んで、コマンドラインの残り部分を実行し、置換します。

TODO: ドキュメント、内部操作説明、モジュール分け、MLPP 独自マクロ(行数情報を D 言語に!)、対応プリプロセッサ増加、対応コンパイラ増加、 /tmp の下汚しすぎ。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h