Как мне проанализировать конец строки с помощью boost::spirit::qi?

StackOverflow https://stackoverflow.com/questions/2429485

Вопрос

Не должен ли простой eol проделать этот трюк?

#include <algorithm>
#include <boost/spirit/include/qi.hpp>
#include <iostream>
#include <string>
using boost::spirit::ascii::space;
using boost::spirit::lit;
using boost::spirit::qi::eol;
using boost::spirit::qi::phrase_parse;

struct fix : std::unary_function<char, void> {
  fix(std::string &result) : result(result) {}
  void operator() (char c) {
    if      (c == '\n') result += "\\n";
    else if (c == '\r') result += "\\r";
    else                result += c;
  }
  std::string &result;
};

template <typename Parser>
void parse(const std::string &s, const Parser &p) {
  std::string::const_iterator it = s.begin(), end = s.end();
  bool r = phrase_parse(it, end, p, space);
  std::string label;
  fix f(label);
  std::for_each(s.begin(), s.end(), f);
  std::cout << '"' << label << "\":\n" << "  - ";
  if (r && it == end) std::cout << "success!\n";
  else std::cout << "parse failed; r=" << r << '\n';
}

int main() {
  parse("foo",     lit("foo"));
  parse("foo\n",   lit("foo") >> eol);
  parse("foo\r\n", lit("foo") >> eol);
}

Выходной сигнал:

"foo":
  - success!
"foo\n":
  - parse failed; r=0
"foo\r\n":
  - parse failed; r=0

Почему последние два терпят неудачу?


Связанный с этим вопрос:

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

Это было полезно?

Решение

Вы используете space как шкипер для ваших вызовов в phrase_parse.Этот анализатор соответствует любому символу, для которого std::isspace возвращает true (при условии, что вы выполняете синтаксический анализ на основе ascii).По этой причине \r\n на входе съедаются вашим шкипером до того, как они могут быть замечены вашим eol синтаксический анализатор.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top