我正在使用Boost.Spirit,它与Boost-1.42.0和VS2005一起发布。我的问题是这样的。
我用逗号分隔了这个字符串。它的前3个字段是字符串,其余是数字。像这样。
String1,String2,String3,12.0,12.1,13.0,13.1,12.4
我的规则是这样的
qi::rule<string::iterator, qi::skip_type> stringrule = *(char_ - ',')
qi::rule<string::iterator, qi::skip_type> myrule= repeat(3)[*(char_ - ',') >> ','] >> (double_ % ',') ;
我正在尝试将数据存储在这样的结构中。
struct MyStruct
{
vector<string> stringVector ;
vector<double> doubleVector ;
} ;
MyStruct var ;
我把它包装在BOOST_FUSION_ADAPT_STRUCTURE中,以便与精神一起使用。
BOOST_FUSION_ADAPT_STRUCT (MyStruct, (vector<string>, stringVector) (vector<double>, doubleVector))
我的解析函数解析该行并在
之后返回trueqi::phrase_parse (iterBegin, iterEnd, myrule, boost::spirit::ascii::space, var) ;
我期待var.stringVector和var.doubleVector被正确填充。但事实并非如此。
出了什么问题?
代码示例位于here
提前致谢, 苏里亚
答案 0 :(得分:6)
qi::skip_type
不是你可以使用船长的东西。 qi :: skip_type是占位符qi::skip
的类型,仅适用于skip[]
指令(允许跳过lexeme[]
或更改正在使用的队长)而不是一个解析器组件,它自己匹配任何输入。您需要指定特定的船长类型(在您的情况下为boost::spirit::ascii:space_type
)。
此外,为了使规则返回已解析的属性,您需要在定义规则时指定期望属性的类型。这让你:
qi::rule<string::iterator, std::string(), ascii:space_type>
stringrule = *(char_ - ',');
qi::rule<string::iterator, MyStruct(), ascii:space_type>
myrule = repeat(3)[*(char_ - ',') >> ','] >> (double_ % ',');
应该完全符合您的期望。