Как делают я анализирую конец строки с повышением:: дух:: qi?

Не был должен простое eol добиться цели?

#include 
#include 
#include 
#include 
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 {
  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 
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

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


Связанный вопрос:

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

9
задан Community 23 May 2017 в 11:46
поделиться

1 ответ

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

14
ответ дан 4 December 2019 в 14:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: