Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 序列解析器和期望解析器的混合使用_C++_Boost_Boost Spirit_Boost Spirit Qi - Fatal编程技术网

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

C++ 序列解析器和期望解析器的混合使用,c++,boost,boost-spirit,boost-spirit-qi,C++,Boost,Boost Spirit,Boost Spirit Qi,v.s. 我想解析以下字符串 "***: @a_-091 , *** 1" 到定义为 using type = boost::fusion::vector<char, int, double>; 如果使用了,结果就可以了。但是,结果与下面的解析器完全不同 *qi::omit[qi::char_ - '@'] >> '@' >> qi::char_ >> '_' >> qi::int_ >> *qi

v.s.

我想解析以下字符串

    "***: @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_
下面是示例代码

    #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;
    }
#包括
#包括
#包括
#包括
#包括
#包括
使用type=boost::fusion::vector;
int main(){
std::istringstream istr{
“***:@a_U091,***1”
};
std::矢量数据;
名称空间qi=boost::spirit::qi;
istr>>std::noskipws>>qi::匹配(*(
*qi::省略[qi::char''@']>>'@'>>qi::char'>>''''>>qi::int'>>*qi::省略[qi::char'@']>>'@'>>数字]>qi::双精度_
),数据);
//istr>>std::noskipws>>qi::匹配(*(
*qi::省略[qi::char''@']>>'@'>>qi::char'>>''''>>qi::int'>>*qi::省略[qi::char'@']>>'@'>>数字]>>qi::双精度_
),数据);
对于(size_t i=0;i!=data.size();++i){

std::cerr作为一个快速提示,也许您可以使用
>
重写

还有你可以写的期望点

a >> b > c


稍后我将测试这一点

两个建议:每个问题一个问题,问题中必须包含代码。然后描述代码,描述它正在做什么(或不做什么)以及您希望做什么。(注释进入注释部分,而不是问题中。)@Mat谢谢。期待进一步的建议。你谈论了两件不同的事情。但是你只展示了一段代码,两件都没有描述。@Mat我不太明白。正如你所建议的,我删除了一个问题。现在,问题是“>>”和“>”之间的不同行为.我相信你的问题与所描述的问题相似。
a >> b > c
a >> b >> (c > eps)