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文書も見つけた: これから読むつもり