Boost.Spirit そのいち
さて Boost.Spirit 。とりあえず introduction と include あたりを読んでざっとどういうものか確認すると、
- recursive-dscent parser/generator 、再帰的下降な構文解析器・生成器をアレコレするための library だよ。
- EBNF: Extended Backus Naur Form ぽいものを利用して parser とかを記述するよ。
- EBNF は ISO-14977 で標準化されてる -> http://www.cl.cam.ac.uk/%7Emgk25/iso-14977.pdf
- 3 つの DSEL: Domain-Specific Embedded Language 、領域特化型埋め込み言語を提供するよ。
- parser の文法を生成するためのもの
- token の特性を定義するためのもの
- 出力 format を書き下すためのもの
- embedded の名の通り C++ の source code 中にそのまま書けるよ。
- Boost.Spirit を使って生成された parser/generator は fully attributed 、属性完全だよ。
- 大きく 4 つの部分にわかれているよ。
- Boost.Spirit.Classic: 以前の Boost Spirit v1.8
- Boost.Spirit.Qi: parser library
- Boost.Spirit.Lex: tokenizer library
- Boost.Spirit.Karma: generator library
- header file だけで構成されている library だよ。
- 内部構成としていっぱい directory があるけど今後も support されるのは以下のものだけで他は使用が推奨されてないよ。
- boost/home
- boost/include
- boost/repository
- version を調べるには
#include <boost/spirit/version.hpp>
して SPIRIT_VERSION macro を使ってね。
とまぁこんなもんか。
ちなみにみんな Boost.Spirit を変態呼ばわりしてるけど C++ native に parser/generator を定義できてしまう、というところに驚いているのかな。んーもとになってる EBNF 自体演算子の使い方が programing language 寄りだし C++ は operator overload できる言語なのでこういう発想はあったと思うんだけど。あーでも自分でやるかどうかと問われるとまぁやってしまった連中を変態呼ばわりするのはわかるかもしれない。
あ、最後に、 version は内部で check したりするにはわかりやすい形で定義されてるとは思うんだけど表示するとなるとちょっとアレなのでとりあえずで以下のような code を書いてみた。
/* * version.cpp * Shows Boost.Spirit version * * written by janus_wel<janus.wel.3@gmail.com> * This source code is in public domain, and has NO WARRANTY. * */ #include <iostream> #include <boost/spirit/version.hpp> int main(void) { unsigned int major = (SPIRIT_VERSION & 0xff00) >> 12; unsigned int minor = (SPIRIT_VERSION & 0x00ff) >> 4; std::cout << "powered by boost::spirit " << major << '.' << minor << std::endl; return 0; }