正如 sehe 所提到的,这可以使用前瞻解析器运算符 &来完成,但如果你也想发出字符,你还需要boost.phoenix、qi::locals和qi::attr。
例如:
#include <boost/fusion/include/std_pair.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <boost/spirit/include/qi.hpp>
#include <iostream>
#include <string>
namespace qi = boost::spirit::qi;
int main(int argc, char** argv)
{
std::string input("foo:/bar");
std::pair<char, std::string> output;
std::string::const_iterator begin = input.begin(),
end = input.end();
qi::rule<std::string::const_iterator, qi::locals<char>, std::pair<char, std::string>()> duplicate =
"foo"
>> qi::omit[
&(":" >> qi::char_[qi::_a = qi::_1])
]
>> qi::attr(qi::_a)
>> ":"
>> *qi::char_;
bool r = qi::parse(begin,
end,
duplicate,
output);
std::cout << std::boolalpha
<< r << " "
<< (begin == end) << " '"
<< output.first << "' \""
<< output.second << "\""
<< std::endl;
return 0;
}
这输出:
true true '/' "/bar"