Как анализировать записи, за которыми следует точка с запятой или новая строка (boost::spirit)?

В Boost::Spirit, как я могу анализировать записи, за которыми следует либо точка с запятой, либо новая строка с необязательной точкой с запятой?

Пример ввода, где каждая запись представляет собой int и double:

12 1.4;
63 13.2
2423 56.4 ; 5 8.1

Вот пример кода, который просто анализирует записи, за которыми следуют пробелы:

#include <iostream>
#include <boost/foreach.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/support_istream_iterator.hpp>
#include <boost/fusion/include/std_pair.hpp>
namespace qi = boost::spirit::qi;

typedef std::pair<int, double> Entry;

template <typename Iterator, typename Skipper>
struct MyGrammar : qi::grammar<Iterator, std::vector<Entry>(), Skipper> {
  MyGrammar() : MyGrammar::base_type(entries) {
    entry = qi::int_ >> qi::double_;
    entries = +entry;
  }
  qi::rule<Iterator, Entry(), Skipper> entry;
  qi::rule<Iterator, std::vector<Entry>(), Skipper> entries;
};

int main() {
  typedef boost::spirit::istream_iterator It;
  std::cin.unsetf(std::ios::skipws);
  It it(std::cin), end;

  MyGrammar<It, qi::space_type> entry_grammar;
  std::vector<Entry> entries;
  if (qi::phrase_parse(it, end, entry_grammar, qi::space, entries)
      && it == end) {
    BOOST_FOREACH(Entry const& entry, entries) {
      std::cout << entry.first << " and " << entry.second << std::endl;
    }
  }
  else {
    std::cerr << "FAIL" << std::endl;
    exit(1);
  }
  return 0;
}

Теперь, чтобы разобрать так, как я хочу (за каждой записью следует точка с запятой или новая строка с необязательной точкой с запятой), я заменил это:

    entries = +entry;

на это:

 entries = +(entry >> (qi::no_skip[qi::eol] || ';'));

где boost::spiritоператор ||означает: (a с последующим необязательным b) или b . Но выдает ошибку, если есть пробел после 1.4в этом примере ввода:

12 1.4
63 13.2

Имеет смысл, что пробел не соответствует из-за no_skip, но я не был в состоянии найти решение.

5
задан Frank 19 May 2012 в 23:40
поделиться