Boost.Spirit.Qi のセマンティックアクションで std::string を受け取る
文字列をパースする場合、*qi::char_ のようなパーサを定義すると思いますが、これだと std::vector
auto parser = '(' >> *(qi::char_ - ')') >> ')'; test_parser("(madohomu)", parser[[](std::vector<char> const& v){ // }]);
この場合、std::string で受け取るには qi::as_string を使用します。
[ソース]
#include <boost/spirit/include/qi.hpp> template <typename P> void test_parser(char const* input, P const& p, bool full_match = true){ using boost::spirit::qi::parse; char const* f(input); char const* l(f + strlen(f)); if (parse(f, l, p) && (!full_match || (f == l))) std::cout << "ok" << std::endl; else std::cout << "fail" << std::endl; } int main(){ namespace qi = boost::spirit::qi; auto parser = '(' >> *(qi::char_ - ')') >> ')'; test_parser("(madohomu)", qi::as_string[parser][[](std::string const& str){ std::cout << str << std::endl; }]); return 0; }
[出力]
madohomu ok
[boost]
- ver 1.49.0