使用Boost Spirit 2解析字符串,将数据填充到用户定义的结构体中

5

我正在使用分发于Boost-1.42.0与VS2005的Boost.Spirit。我的问题如下。

我有一个用逗号分隔的字符串。其中前三个字段是字符串,其余都是数字。像这样。

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将其包装,以便与spirit一起使用。
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被正确填充,但事实并非如此。
出了什么问题?
代码示例在这里here
提前感谢您的帮助, Surya

1
如果您能够发布一个连续的、可编译的代码片段来重现您的问题,那么您可能会得到更多愿意查看并尝试帮助的人。 - Emile Cormier
源代码示例已提供在 Pastebin 网站上。http://www.pastebin.org/117703 - Surya
1个回答

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

这应该完全符合您的预期。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接