qi :: parse boost更改开始迭代器

时间:2017-07-02 02:13:40

标签: c++ boost boost-spirit-qi

下面的函数更改迭代器,它首先指向s.begin()并指向s.begin() + 1之后?我没错?

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

using namespace boost::spirit;

int main()
{
    std::string s;
    std::getline(std::cin, s);
    auto it = s.begin();
    bool match = qi::parse(it, s.end(), ascii::digit);
    std::cout << std::boolalpha << match << '\n';
    if (it != s.end())
        std::cout << std::string{ it, s.end() } << '\n';
}

INPUT:

  

1Kar

输出:

  

1 个答案:

答案 0 :(得分:2)

是的,如果解析器(下面的expr参数)成功,你就是对的。输入1Kar会发生这种情况。您正在使用以下内容:

//boost/spirit/home/qi/parse.hpp
template <typename Iterator, typename Expr>
inline bool
parse(Iterator& first, Iterator last, Expr const& expr);

参考:Iterator Based Parser API

第一个迭代器由左值引用传递,在成功的解析上,它被重新定位到解析器使用的最右边位置。如果没有任何解析组件失败,则移动迭代器,例如:

//Input: 1Kar
qi::parse(it, s.end(), ascii::digit >> ascii::digit); //Fail
assert(it == s.begin());

//Input: 1Kar
qi::parse(it, s.end(), ascii::digit); //Ok
assert(it == std::next(s.begin()));