使用boost :: spirit将元素解析为vector,使用分号或换行符作为分隔符

时间:2012-05-05 18:00:05

标签: c++ parsing boost boost-spirit

我想使用std::vector<int>将一系列整数解析为boost::spirit。整数可以用分号或换行符分隔。

但是这个语法不能编译:

typedef std::vector<int> IntVec;
template <typename Iterator, typename Skipper>
struct MyGrammar : qi::grammar<Iterator, IntVec(), Skipper> {
  MyGrammar() : MyGrammar::base_type(start) {
    start = +(qi::int_
              >> (";" | qi::no_skip(qi::eol)));
  }
  qi::rule<Iterator, IntVec(), Skipper> start;
};

要清楚,我想解析以下输入,例如

1; 2; 3
4 ; 5

到一个向量(1,2,3,4,5)。我怎么能这样做,为什么我的版本不能编译?

我可以以某种方式将分隔符(“分号或换行符”)写为自己的规则吗?它的返回类型是什么?某种null值?

1 个答案:

答案 0 :(得分:2)

看起来在检查分号时正在应用了队长,因此在达到qi::no_skip[qi::eol]时已经消耗了跳过字符(包括换行符)。以下内容适用于我,首先使用no_skip令牌:

    start = qi::int_ % (qi::no_skip[qi::eol] | ';');

我正在使用%,因此最终整数不需要后跟分号或行尾。