読者です 読者をやめる 読者になる 読者になる

Boost.Spirit.Qi カッコ書きの中身を取り出す

C++

こういう文字列の

abc(123)

123を取り出す。

#include <iostream>
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/vector.hpp>

int main()
{
   namespace qi = boost::spirit::qi;
   typedef boost::fusion::vector<std::string, std::string> value_type;
   typedef qi::rule<std::string::const_iterator, value_type()> rule_type;

   const rule_type r = *(qi::char_ - '(') >> '(' >> *(qi::char_ - ')') >> ')';

   const std::string s = "abc(123)";
   value_type result;
   if (!qi::parse(s.begin(), s.end(), r, result))
   {
       std::cout << "failed" << std::endl;
       return 1;
   }

   std::cout << boost::fusion::at_c<0>(result) << std::endl
             << boost::fusion::at_c<1>(result) << std::endl;
}
abc
123

取り出せたけど、abcがいらない。
tupleのignoreみたいなことをQiの方でやりたいんだけど、どうればいいんだろう。



追記:
qi:omit[]ディレクティブで解決しました。

http://twitter.com/yuttieyuttie/status/16290056688:twitter

@yuttieyuttieさんありがとうございます!

#include <iostream>
#include <boost/spirit/include/qi.hpp>

int main()
{
   namespace qi = boost::spirit::qi;
   typedef std::string value_type;
   typedef qi::rule<std::string::const_iterator, value_type()> rule_type;

   const rule_type r = qi::omit[*(qi::char_ - '(')] >> '(' >> *(qi::char_ - ')') >> ')';

   const std::string s = "abc(123)";
   value_type result;
   if (!qi::parse(s.begin(), s.end(), r, result))
   {
       std::cout << "failed" << std::endl;
       return 1;
   }

   std::cout << result << std::endl;
}
123