慣れるまで大変だったけど、ANTLR Parser Generator はやはり便利。 自分でデータ構造を用意しなくてもparse treeを自在に組み替えたりできる。 Bisonでparse tree用の動的メモリ確保の機構を組み込むのに、Bisonの出力ソースをスクリプトで変更するなど、煩雑なことをやってきたのが馬鹿みたいに思えてく る。
何より、C++やJavaのコードを直接出力できるのが一番。 有名なyacc(lexer)はC++に対応していたけれど、Bison(parser)は、Cしか出力できなかったり、古い形のライブラリを #includeをしていたり、global変数を多用しているのでマルチスレッド環境で使うのに難があったり。 parseを開始する関数 yyparse()の引数には、
#define YYPARSE_PARAM
で定義したもの1つしか使えなかったり…。どうしてもクエリの結果やparse treeを保持するのに間接参照が必要となるので、記述が面倒だったり。
Bison は一応global変数を出力しないように変更はできるのだけれど、parseした結果をunion型でしか受け渡せないので、C++のクラスを渡すよう に変換するにはそれはもう涙ぐましい努力がありました。。。 (今思えば、そんなことしなくても、YYPARSE_PARAMにparse treeのrepositoryを用意して、parse treeのidだけを扱うようにすればできたのかも。面倒なことに変わりは無いが)
ANTLRが使えるようになった今、bisonとはおさらばです。 yaccは状態ごとにlexerの挙動を変化させられて便利なので、また使う機会もあるでしょうが。
(補足)
最近のbison(version 1.875以上。現在は2.1)は、%parse-paramというパラメータが増えたようで、yyparse()に渡す引数の問題は解決したようです。
0 件のコメント:
コメントを投稿