C++ 使用子表达式解析boost::spirit语法的结果
我正在尝试进入boost spirit 2,但以下代码没有按预期工作:C++ 使用子表达式解析boost::spirit语法的结果,c++,boost,boost-spirit,boost-spirit-qi,C++,Boost,Boost Spirit,Boost Spirit Qi,我正在尝试进入boost spirit 2,但以下代码没有按预期工作: template<typename Iterator> struct my_grammar : qi::grammar<Iterator, std::string()> { my_grammar() : my_grammar::base_type(time_literal) { using ascii::char_; using ascii::digit
template<typename Iterator>
struct my_grammar : qi::grammar<Iterator, std::string()>
{
my_grammar() : my_grammar::base_type(time_literal)
{
using ascii::char_;
using ascii::digit;
time_literal = digit >> -digit >> char_(':') >> digit >> digit >> -(char_(':') >> digit >> digit);
}
qi::rule<Iterator, std::string()> time_literal;
};
void main()
{
my_grammar<std::string::iterator> g;
std::string input("01:02:03");
std::string::iterator begin = input.begin();
std::string::iterator iter = begin;
std::string::iterator end = input.end();
std::string result;
bool matched = phrase_parse(iter, end, g, ascii::space, result);
std::cout << (matched ? "matched "+std::string(begin, iter) : "no match") << std::endl;
if (iter != end)
std::cout << "remaining: " << std::string(iter, end) << std::endl;
else
std::cout << "result: " << result << std::endl;
std::cout << std::endl;
}
但我希望看到:
matched: 01:02:03
result: 01:02:03
那么,最后两个数字到哪里去了?我怎样才能找回它们呢?在boost 1.51.0中,我的工作正如您所期望的那样。您使用的是什么版本?我仍在使用boost 1.46.1,而且由于boost库在过去存在向后兼容性问题,所以在不久的将来升级将不是一个选项。您的代码在boost 1.49.0上对我来说是正确的。您的spirit版本是2.4.2,而pelletj和我都使用spirit 2.5.1。你可以试着把规则分成小时、分钟、秒,看看这是否能解决问题。另外,试着打开
BOOST\u SPIRIT\u DEBUG
和朋友,看看这是否提供了一些见解。
matched: 01:02:03
result: 01:02:03