提升基于精神语法的字符串拆分

sk7*_*sk7 3 c++ boost boost-spirit boost-spirit-qi

我正在使用Boost 1.44,Spirit解析器适用于数值解析,但对于字符串解析来说真的很棘手.我试图解析一个字符串,使用多个分隔符进行拆分:',',';' 要么 ' '.当我这样做时,它适用于数字(其中vect = vector <double>):

qi::parse(first,last,double_ >> *(',' >> double_  | ' ' >> double_ | ';' >> double_),
Run Code Online (Sandbox Code Playgroud)

VECT,空间);

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

+char_ >> *(',' >> +char_  | ' ' >> +char_ | ';' >> +char_)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

/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>]’
Run Code Online (Sandbox Code Playgroud)

我将错误缩小为语法语法中的第一个+ char_,它被视为一系列字符而不是字符串.有什么方法可以解决这个问题吗?

谢谢

hka*_*ser 7

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

但即使它以你想要的方式编译,它也不会按照你期望的方式解析.精神本质上是贪婪的,这意味着+char_将无条件地消耗你输入中留下的任何东西.这似乎更好

+~char_(", ;") % char_(", ;")
Run Code Online (Sandbox Code Playgroud)

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