Pregunta

Sólo he estado trabajando con Boost.Spirit (de Boost 1,44) durante tres días, tratando de analizar los mensajes de correo electrónico primas a través de la gramática exacta en RFC2822. Pensé que estaba empezando a entenderlo y llegar a alguna parte, pero luego me encontré con un problema:

#include <iostream>
#include <boost/spirit/include/qi.hpp>

namespace qi = boost::spirit::qi;
using qi::omit;
using qi::repeat;
using std::cout;
using std::endl;

typedef qi::rule<std::string::const_iterator, std::string()> strrule_t;

void test(const std::string input, strrule_t rule) {
    std::string target;
    std::string::const_iterator i = input.begin(), ie = input.end();

    if (qi::parse(i, ie, rule, target)) {
        cout << "Success: '" << target << "'" << endl;
    } else {
        cout << "Failed to match." << endl;
    }
}

int main() {
    strrule_t obsolete_year = omit[-qi::char_(" \t")] >> repeat(2)[qi::digit] >>
        omit[-qi::char_(" \t")];
    strrule_t correct_year = repeat(4)[qi::digit];

    test("1776", correct_year | repeat(2)[qi::digit]); // 1: Works, reports 1776.
    test("76",   obsolete_year);                       // 2: Works, reports 76.
    test("76",   obsolete_year | correct_year);        // 3: Works, reports 76.
    test(" 76",  correct_year | obsolete_year);        // 4: Works, reports 76.
    test("76",   correct_year | obsolete_year);        // 5: Fails.
    test("76",   correct_year | repeat(2)[qi::digit]); // 6: Also fails.
}

Si la prueba # 3 obras, entonces ¿por qué la prueba # 5 - la misma prueba exacta con las dos alternativas invierte -? Fallar

Por la misma razón, si se me permite la expresión: si la prueba # 4 obras, y el espacio al principio se marca como opcional, entonces ¿por qué la prueba # 5 (la misma prueba exacta con la misma entrada exacta, guardar el que no hay espacio inicial en la entrada) fallar?

Y, por último, si se trata de un error en Boost.Spirit (como sospecho que debe ser), ¿cómo puedo trabajar alrededor de ella?

¿Fue útil?

Solución

Eso es porque te encuentras con un error en repeat[] Directiva del Espíritu. Gracias por el informe, que fija este problema en el SVN (rev. [66167]) y estarán disponibles en v1.45 Boost. Al mismo tiempo, me gustaría añadir su pequeña prueba como una prueba de regresión para banco de pruebas de alcohol. Espero que no me importa hacerlo.

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