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 | '_')
一度、英数字以外を挟んだ後に、その後の単語を処理するように書く。