2010-03-11 10 views
9

¿No debería un simple eol hacer el truco?¿Cómo puedo analizar el final de línea con boost :: spirit :: qi?

#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:

Using boost::spirit, how do I require part of a record to be on its own line?

Respuesta

13

está usando el 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 un análisis basado en Ascii). Por esta razón, el patrón \r\n en la entrada es comido por su patrón antes de que puedan ser vistos por su analizador eol.

+1

El uso de 'phrase_parse (it, end, p, space - eol)' permitió que 'eol' tuviera éxito. ¡Gracias! –

+1

@GregBacon Cuando escribo 'space-eol', recibo un mensaje de error muy extraño y prolongado. – Dilawar

+1

@Dilawar Vea esta respuesta http://stackoverflow.com/a/10469726/85371] para obtener sugerencias y técnicas relacionadas para cambiar el comportamiento del patrón – sehe

Cuestiones relacionadas