camlp4はじめてみた
このcamlp4を使ったmakefile処理プログラムの作成のスライドを見て学習。ソースアーカイブのビルド方法は下側のURLにあるMakefileを少し修正すれば使えます(パッケージlibequeue-ocamlは必要)。
例のプログラムがやることは、makefileに書いたことを実行することだが、それを以下のようにしてやっている(driver.ml):
- camlp4フロントエンド(Makefileパーズ -> OCamlデータ構造化) -> ルール構造からCコードを生成するバックエンドコードとあわせコンパイル&実行(Cコード生成) -> gccビルド
つまりのところ、引数のMakefileを、ファイルのタイムスタンプチェックとコマンド起動をさせるCソースに変換して、それをビルドして実行するという荒業をやっている。
ソース中では、Cコード生成のコードのためさらに、camlp4用のパーザーフロントエンド、clexとcquot(&frontc)を実装し、自らのソースで使用している。OCamlコード生成はpa_extendとq_MLast、ただし今ではdeprecatedなフロントエンドも一箇所つかっていた。
構成は:
- Makefileプリプロセッサmkc-fe: mlex.mll fe.ml
- mkc: driver.mlのみ
- バックエンドライブラリ: be.ml mk.ml frontc/
- Cコード生成用camlp4フロントエンド: clex.mll cquot.ml
camlp4の構造はつかめたので、簡単な言語をパーズしてocamlコードに変換させる程度ならできそうだ。
また、別のcamlp4文書も見つけた: これから読むつもり