3

我正在使用 Boost 1.44,Spirit 解析器非常适合数字解析,但对于字符串解析确实很棘手。我正在尝试使用多个分隔符解析要拆分的字符串:',',';' 或者 ' '。当我这样做时它适用于数字(其中 vect = vector < double >):

qi::parse(first,last,double_ >> *(',' >> double_  | ' ' >> double_ | ';' >> double_),

矢量,空间);

但是,当我使用 vect = vector< string > 修改字符串的语法时,

+char_ >> *(',' >> +char_  | ' ' >> +char_ | ';' >> +char_)

我收到以下错误:

/usr/include/boost/spirit/home/qi/detail/assign_to.hpp:109:13: error: invalid conversion from ‘char’ to ‘const char*’/usr/include/boost/spirit/home/qi/detail/assign_to.hpp:109:13: error:   initializing argument 1 of ‘std::basic_string<_CharT, _Traits,_Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]’

我将错误缩小为语法语法中的第一个 +char_ ,它被视为一系列字符而不是字符串。有没有办法解决这个问题?

谢谢

4

1 回答 1

7

使用最新版本的 Spirit 字符串处理(您的操作方式)变得更加容易。我建议使用 Boost V1.47 中的 Spirit,它对属性处理代码进行了重大重写。

但即使它按照您想要的方式编译,它也不会按照您期望的方式解析。Spirit 本质上是贪婪的,这意味着+char_它将无条件地消耗您输入中剩余的任何内容。似乎更好

+~char_(", ;") % char_(", ;")

即,一个或多个 ( +) 字符,而不是 ( ~) 在集合", ;"中正好穿插其中一个字符。列表解析器 ( %) 公开了 a vector<A>,其中A是左侧表达式的属性,vector<string>在上面的例子中是 a。

于 2011-09-27T11:30:09.323 回答