Proglrの最近の進展 [SML]
SML用のパーサジェネレータProglrの最近の進展について。
字句解析の自動生成
Proglrはml-ulexで生成された字句解析器と結合するようになっていて、 これまでは字句解析は自分で書く必要があった。
しかし、凝った字句解析をしない場合はやはり自動で生成してくれるのが便利だ。 というわけで文法定義からml-ulexのソースを自動生成する機能をつけた。
具体的にはtoken Add "+";
のようなトークン定義があった場合は
指定された文字列のトークンを字句解析にも追加する。
token Integer of int;
,
token Double of real;
,
token Char of char;
,
token String of string;
,
token Ident of string;
のような定義があった場合はそれぞれのリテラルのトークンを追加する。
これにより簡単な言語を作る場合はml-ulexのソースをまったく書かなくてもよくなる。
example/calc/calc.cfというサンプルがあるのでそれを参照してほしい。
コメント定義の自動生成
同様にコメントについても字句解析に自動追加できるようになった。 下記のような定義でそれぞれブロックコメントと行コメントを追加できる。 これはBNFCと同様である。
各処理系のための雛形の自動生成
各ML処理系でビルドするためのドライバ、Makefileなども自動生成するようにした。 ml-lptランタイムが同梱されていない処理系のために、 ml-lptランタイムのソースも展開されるようにした。
これにより基本的には文法定義ファイルだけから実行可能ファイルを作るまでのすべてが生成可能となった。
MLton, Poly/ML, Alice ML, MLKit, Moscow ML では数行のコマンドラインでサンプルプロジェクトがビルドできるようになっている。 起動方法はREADMEを参照してほしい。
一方でProglr自身をビルドするための処理系としては、 当面MLtonとPoly/MLに注力することにした。 SML#向けのファイルも残っているが、動かないものと思ってほしい。
ちなみにAlice MLのビルドの作法を調べていたのだが、 リンクに関してはまだあまりわかっていない。 コンパイルをすると.alcというオブジェクトファイルができ、 これは依存する.alcがしかるべき位置に配置されていればそのまま実行できる。 依存するものも含めて1ファイルにするためにalicelinkを使う…と思っているのだが、 alicelinkを使ってリンクしたつもりのファイルだけで実行しようとすると やはり依存性のエラーが出てしまう。 このためREADMEではリンクせずに実行するような手順を書いている。
Graphvizファイルの生成
文法定義から作られるオートマトンを視覚化するためのdotファイルを生成できるようにした。
-a 出力ファイル名
というオプションを与えると生成できる。
依存するツール
Proglrが依存している外部ツールを挙げる。 基本的には昔ながらのUnixのツールであるため、 利用できないということはないと思う。
- m4: ファイル生成時にテンプレート機能として使う
- Perl: ml-ulexの出力結果にパッチを当てるのに使っている(Alice ML互換にするためのパッチ)
- Expect: Poly/MLでビルドするときにインタラクティブシェルを制御するのに使う
- DejaGnu: Proglrのテスト(make check)で使う
コメント 0