Domanda

Ho solo lavorato con Boost.Spirit (da 1,44 Boost) per tre giorni, cercando di analizzare i messaggi di posta elettronica prime attraverso la grammatica esatto in RFC2822. Ho pensato che stavo iniziando a capire e arrivare da qualche parte, ma poi mi sono imbattuto in 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.
}

Se Test # 3 opere, allora perché non prova # 5 - la stessa prova con le due alternative invertito -? Fallire

Per lo stesso motivo, se mi perdonate l'espressione: se Test # 4 opere e lo spazio all'inizio è contrassegnato come optional, allora perché prova # 5 (lo stesso test esatto con la stessa identica di ingresso, salvo che non c'è spazio di primo piano nel ingresso) fallire?

E, infine, se questo è un bug in Boost.Spirit (come ho il sospetto che deve essere), come posso lavorare intorno ad esso?

È stato utile?

Soluzione

Questo è perché si colpisce un bug in repeat[] direttiva dello Spirito. Grazie per la segnalazione, ho risolto questo problema in SVN (rev. [66.167]) e sarà disponibile in Boost V1.45. Allo stesso tempo, vorrei aggiungere la piccolo test come test di regressione per suite di test dello Spirito. Spero che non mi dispiace farlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top