序列解析器和期望解析器的混合使用

时间:2015-05-30 10:23:18

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

> qi::double_ vs.s. >> qi::double_

我想解析以下字符串

    "***: @a_-091 , *** 1"

到定义为

的结构
    using type = boost::fusion::vector<char, int, double>;

解析器时

    *qi::omit[qi::char_ - '@'] >> '@' >> qi::char_ >> '_' >> qi::int_ >> *qi::omit[qi::char_ - qi::digit] >> qi::double_
使用

,结果还可以。但是,结果与以下解析器完全不同

    *qi::omit[qi::char_ - '@'] >> '@' >> qi::char_ >> '_' >> qi::int_ >> *qi::omit[qi::char_ - qi::digit] > qi::double_

以下是示例代码。

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

    using type = boost::fusion::vector<char, int, double>;

    int main() {
        std::istringstream istr{
            "***: @a_-091 , *** 1"
        };

        std::vector<type> data;

        namespace qi = boost::spirit::qi;
        istr >> std::noskipws >> qi::match(*(
            *qi::omit[qi::char_ - '@'] >> '@' >> qi::char_ >> '_' >> qi::int_ >> *qi::omit[qi::char_ - qi::digit] > qi::double_
            ), data);
        // istr >> std::noskipws >> qi::match(*(
            *qi::omit[qi::char_ - '@'] >> '@' >> qi::char_ >> '_' >> qi::int_ >> *qi::omit[qi::char_ - qi::digit] >> qi::double_
            ), data);

        for (size_t i = 0; i != data.size(); ++i) {
            std::cerr << data[i] << "\n";
        }

        return 0;
    }

PS: 该问题已通过评论中 cv_and_he 证明的链接得到解决。它是由&#34;&gt;&gt;&#34;的混合使用引起的。 (序列解析器)和&#34;&gt;&#34; (期望解析器)。

1 个答案:

答案 0 :(得分:0)

作为一个快速提示,也许您可​​以使用>>重写。

仍然有期望点你可以写

a >> b > c

a >> b >> (c > eps)

我稍后会测试