【发布时间】:2015-05-30 10:23:18
【问题描述】:
我要解析下面的字符串
"***: @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_
使用,结果OK。但是,使用下面的解析器,结果完全不同
*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证明的链接解决。这是由于“>>”(序列解析器)和“>”(期望解析器)的混合使用造成的。
【问题讨论】:
-
两个建议:一题一题,题中必须有代码。并描述代码,描述它正在做什么(或不做什么)以及你所期望的。 (并且 cmets 进入评论部分,而不是在问题中。)
-
@Mat 谢谢。期待进一步的建议。
-
你谈到了两件做不同事情的事情。然而你只展示了一段代码,却没有描述。
-
@Mat 我不太明白。正如你所建议的,我删除了一个问题。现在,问题是“>>”和“>”之间的不同行为。
-
我相信您的问题与here 描述的问题类似。
标签: c++ boost boost-spirit boost-spirit-qi