解析字符串,升压精神2,填补用户定义的结构数据
-
20-09-2019 - |
题
我使用Boost.Spirit将其用升压-1.42.0与VS2005分布。我的问题是这样的。
我有此字符串,将其用逗号delimted。它的第一个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))
我的解析功能解析线和返回true和后
qi::phrase_parse (iterBegin, iterEnd, myrule, boost::spirit::ascii::space, var) ;
我期待var.stringVector和var.doubleVector正确填写。但是它不是这样的。
这是怎么回事了?
的代码示例位于此处
在预先感谢 苏里亚
解决方案
qi::skip_type
是不是你可以使用一个船长。气:: 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_ % ',');
这应该做的正是你所期望的。
不隶属于 StackOverflow