【问题标题】:Boost spirit grammar based string splitting基于Boost Spirit语法的字符串拆分
【发布时间】:2011-09-26 00:54:16
【问题描述】:

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

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

向量,空间);

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

+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_,它被视为一系列字符而不是字符串。有没有办法解决这个问题?

谢谢

【问题讨论】:

标签: c++ boost boost-spirit boost-spirit-qi


【解决方案1】:

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

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

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

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

【讨论】:

  • +1,我之前没有注意到~解析器运算符(我仍然使用char_ - char_(", ;")代替
猜你喜欢
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多