5

我正在使用 Boost.Spirit,它与 VS2005 的 Boost-1.42.0 一起分发。我的问题是这样的。

我有这个用逗号分隔的字符串。它的前 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))

我的 parse 函数解析该行并返回 true 和之后

qi::phrase_parse (iterBegin, iterEnd, myrule, boost::spirit::ascii::space, var) ;

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

出了什么问题?

代码示例位于此处

在此先感谢,苏里亚

4

1 回答 1

6

qi::skip_type不是你可以使用船长的东西。qi::skip_type 是占位符的类型qi::skip,它仅适用于skip[]指令(在 a 中启用跳过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_ % ',');

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

于 2010-03-19T13:04:30.327 回答