C++ Boost Spirit で distinct を用いて単語を正しく分ける ― 2020年02月01日 10時03分24秒
今回、すこし困ったのが、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 | '_')
最近のコメント