Frage

habe ich nur mit Boost.Spirit gearbeitet (von Boost-1.44) für drei Tage, versuchen, über die genaue Grammatik in RFC2822 roh E-Mail-Nachrichten zu analysieren. Ich dachte, ich fing an, sie zu verstehen und irgendwo, aber dann lief ich in ein Problem:

#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.
}

Wenn Test # 3 funktioniert, warum dann tut Test # 5 - der exakt gleiche Test mit den beiden Alternativen umgekehrt - nicht

Aus dem gleichen Grunde, wenn Sie den Ausdruck verzeihen werden: Wenn Test # 4 Werke, und der Raum am Anfang als optional markiert, warum dann tut Test # 5 (den exakt gleichen Test mit dem exakt gleichen Eingang, sparen, dass es kein führender Platz im Eingabe) scheitern?

Und schließlich, wenn dies ein Fehler in Boost.Spirit ist (wie ich vermute, es sein muss), wie kann ich es umgehen?

War es hilfreich?

Lösung

Das ist, weil Sie einen Fehler in Geist der Richtlinie repeat[] getroffen. Vielen Dank für den Bericht, fest ich dieses Problem in SVN (rev. [66167]), und es wird in Boost-V1.45 zur Verfügung. Zugleich würde Ich mag Ihren kleinen Test als Regressionstest zu Spirit Testsuite hinzuzufügen. Ich hoffe, dass du mich nicht so tun etwas dagegen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top