Frage

Meine Situation: Ich bin neu in Geist, ich habe VC6 zu nutzen und so bin mit Geist 1.6.4

.

Ich habe eine Linie, die wie folgt aussieht:

//The Description;DESCRIPTION;;

Ich mag den Text DESCRIPTION in einem String setzen, wenn die Zeile mit //The Description; beginnt.

Ich habe etwas, das funktioniert, sieht aber nicht so elegant zu mir:

vector<char> vDescription; // std::string doesn't work due to missing ::clear() in VC6's STL implementation
if(parse(chars,
    // Begin grammar
    (
       as_lower_d["//the description;"]
    >> (+~ch_p(';'))[assign(vDescription)]
    ),
    // End grammar
    space_p).hit)
{
    const string desc(vDescription.begin(), vDescription.end());
}

Ich würde viel mehr wie alle druckbaren Zeichen zuweisen bis zum nächsten ';' aber das Folgende weil parse(...).hit == false nicht funktionieren

parse(chars,
        // Begin grammar
        (
           as_lower_d["//the description;"]
        >> (+print_p)[assign(vDescription)]
        >> ';'
        ),
        // End grammar
        space_p).hit)

Wie mache ich es schlagen?

War es hilfreich?

Lösung

Sie können mit versuchen confix_p :

confix_p(as_lower_d["//the description;"],
         (+print_p)[assign(vDescription)],
         ch_p(';')
        )

Es sollte auf Fred Antwort entsprechen.

Der Grund, Ihr Code fehlschlägt, weil print_p ist gierig . Der +print_p Parser Zeichen verbrauchen, bis das Ende des Eingangs oder ein nicht-druckbare Zeichen trifft. Semikolons ist bedruckbar, so print_p behauptet es. Ihre Eingabe wird erschöpft, wird die Variable zugeordnet ist, und das Spiel ausfällt -. Es gibt nichts mehr für das letzte Semikolon Ihrer Parser übereinstimmen

Freds Antwort baut einen neuen Parser, (print_p - ';'), das alles passt print_p tut, mit Ausnahme von Semikolons. "Wer paßt alles außer X , und dann passen X " ist ein gemeinsames Muster, so confix_p als Abkürzung vorgesehen für diese Art von Parser konstruieren. Die Dokumentation schlägt vor, indem es für das Parsen von C- oder Pascal-Stil Kommentare, aber das ist nicht erforderlich.

Für den Code arbeiten, Geist müßte erkennen, dass die gierigen print_p zu viel abgestimmt und dann Backtrack , damit weniger entsprechen. Aber obwohl Geist wird Rückzieher, wird es nicht in die „Mitte“ Rückzieher, was ein Unter Parser sonst Gierig entsprechen. Es wird auf den nächsten Rückzieher „Entscheidungspunkt“, aber Ihre Grammatik hat keine. Siehe Exhaustive Rückzieher und gierig RD im Geist Dokumentation.

Andere Tipps

Sie sind nicht ein Hit, weil immer ‚;‘ wird durch print_p abgestimmt. Versuchen Sie folgendes:

parse(chars,
    // Begin grammar
    (
       as_lower_d["//the description;"]
    >> (+(print_p-';'))[assign(vDescription)]
    >> ';'
    ),
    // End grammar
    space_p).hit)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top