C++ Boost Spirit で distinct を用いて単語を正しく分ける2020年02月01日 10時03分24秒

Boost の Spirit は C++ で構文解析を行うパーサ。C++ を書いているのに C++ ではない錯覚が起きる程、癖がある。その為、ある程度の慣れが必要。しかし、慣れれば手っ取り早くに単純な構文解析が出来る。

今回、すこし困ったのが、Spirit が特定の単語を認識して読み込んだ後も、そのまま進めてしまう問題。Qi Distinct Directive にそのものずばりの例があるのだが、探す単語は Skipper や Space に偏ってしまって見つけづらい。

算術演算と変数を許容すると OR 等は結構簡単に他の単語にかぶさってしまう。例えば、ORDER が、OR 演算子と DER 変数として分解されてしまった。その様なときに、OR の後にアルファベットが続かない様に書く。

上の例からだと、 "description" >> *(char_ - eol) だと、「descriptionident」が読み込めてしまうのだ。distinct(区切り文字)[トークン]として使う。

#include <boost/spirit/repository/include/qi_distinct.hpp>

boost::spirit::repository::distinct(boost::spirit::ascii::alnum | '_')
     ["description"] >> +(boost::spirit::ascii::alnum | '_')
一度、英数字以外を挟んだ後に、その後の単語を処理するように書く。

コメント

コメントをどうぞ

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

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

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

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2020/02/01/9208989/tb

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