我使用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_ % ',');

这应该做的正是你所期望的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top