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

[コンパイラ]

  • g++ (GCC) 4.8.0 20120415 (experimental)