Pregunta

En caso de que no un simple eol hacer el truco?

#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);
}

Salida:

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

¿Por qué fracasan los dos últimos?


pregunta relacionada:

Uso de impulso :: espíritu, ¿cómo hago que requiero parte de un registro para estar en su propia línea?

¿Fue útil?

Solución

Está utilizando space como el patrón para sus llamadas a phrase_parse. Este analizador coincide con cualquier carácter para el que std::isspace devuelve verdadero (suponiendo que está haciendo el análisis basado en ASCII). Por esta razón, el \r\n en la entrada son el alimento de su patrón antes de que puedan ser vistos por el analizador eol.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top