C++ 使用子表达式解析boost::spirit语法的结果

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

我正在尝试进入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;

        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