Boost Spirit で locals を使い、読み込んだ文字を後から参照する2020年12月15日 13時18分58秒

Boost Spirit のパーサは、パーサの中に変数を定義して、読み込んだ値を後から参照することが出来る qi::locals がある。

主な使い方としては数字を読み込んで、繰り返しの回数を固定したり、読み込んだ文字を繰り返したり、避けたりしたりするのに使う。Parser Rule に軽く扱われている。こちらに載っている例だと、同じ文字を繰り返すのに使っている。

qi::rule< char const*, locals <char > > rl;
rl = ascii::alpha[ qi::labels::_a = qi::labels::_1] >> char_( qi::labels::_a ); // get two identical characters
test_parser( "aa", rl ); // pass
test_parser( "ax", rl ); // fail
Boost での紹介だとさらっと軽く触れるだけだが、かなり重宝する実装の一つ。

locals に渡した型の数だけ _a から始まる変数が作られる。作成していない変数を使おうとするとコンパイルエラーになるのだが、エラーの出力が難解で、locals が定義されていない為に起きているのを見破るのはかなり難しい。

locals< < char const*, locals<char, bool, int > >
上の例では、三つの変数を定義している。chat 型、真偽型、整数型で、それぞれ、_a、 _b、 _c で利用できる。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2020/12/15/9327072/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。