使用Boost Spirit 2解析字符串,以填充用户定义的struct中的数据

Sur*_*rya 5 c++ boost boost-spirit boost-spirit-qi

我正在使用随着VS2005与Boost-1.42.0一起发布的Boost.Spirit.我的问题是这样的.

我有这个用逗号分隔的字符串.它的前3个字段是字符串,其余是数字.像这样.

String1,String2,String3,12.0,12.1,13.0,13.1,12.4
Run Code Online (Sandbox Code Playgroud)

我的规则是这样的

qi::rule<string::iterator, qi::skip_type> stringrule = *(char_ - ',')
qi::rule<string::iterator, qi::skip_type> myrule= repeat(3)[*(char_ - ',') >> ','] >> (double_ % ',') ;
Run Code Online (Sandbox Code Playgroud)

我正在尝试将数据存储在这样的结构中.

struct MyStruct
{
   vector<string> stringVector ;
   vector<double> doubleVector ;
} ;

MyStruct var ;
Run Code Online (Sandbox Code Playgroud)

我把它包装在BOOST_FUSION_ADAPT_STRUCTURE中以与精神一起使用它.

BOOST_FUSION_ADAPT_STRUCT (MyStruct, (vector<string>, stringVector) (vector<double>, doubleVector))
Run Code Online (Sandbox Code Playgroud)

我的解析函数解析该行并返回true和after

qi::phrase_parse (iterBegin, iterEnd, myrule, boost::spirit::ascii::space, var) ;
Run Code Online (Sandbox Code Playgroud)

我期待var.stringVector和var.doubleVector被正确填充.但事实并非如此.

出了什么问题?

代码示例位于此处

谢谢,苏里亚

hka*_*ser 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_ % ',');
Run Code Online (Sandbox Code Playgroud)

这应该完全符合你的期望.