Как мне проанализировать конец строки с помощью boost::spirit::qi?
-
19-09-2019 - |
Вопрос
Не должен ли простой 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
синтаксический анализатор.
Не связан с StackOverflow