3 Stimmen

Verwenden von Boost Spirit zum Parsen einer Textdatei und zum Überspringen großer Teile davon

Ich habe den folgenden std::string:

label A: 34

label B: 45

...

Ich möchte einzelne ganze Zahlen extrahieren, die auf alle Vorkommen von label A oder label B folgen, und sie in die entsprechenden vector a, b einfügen. Eine einfache, aber nicht elegante Möglichkeit, dies zu tun, besteht darin, find("label A") und find("label B") zu verwenden und das erste gefundene zu parsen. Gibt es eine prägnante Möglichkeit, dies mit Spirit auszudrücken? Wie überspringen Sie alles außer label A oder label B?

3voto

sehe Punkte 346808

Sie können einfach

auslassen [ eol >> *char_ - ("\nlabel A:") ] >> eol

Beispiel: Live auf Coliru

Es gibt auch die seek[] Direktive im Repository. Das Folgende ist äquivalent zu dem obigen:

 repo::seek [ eol >> &lit("int main") ] 

Hier ist eine Beispielanalyse Ihres Originalmusters:

*repo::seek [ eol >> "label" >> char_("A-Z") >> ':' >> int_ ],

Dies wird ohne weitere Modifikationen in std::vector > analysiert.

Auch auf Coliru:

#if 0

label A: 34

label B: 45

...
#endif
#include 
#include 
#include 
#include 
#include 

namespace qi   = boost::spirit::qi;
namespace repo = boost::spirit::repository::qi;

int main()
{
    std::ifstream ifs("main.cpp");
    ifs >> std::noskipws;

    boost::spirit::istream_iterator f(ifs), l;

    std::vector > parsed;
    using namespace qi;
    bool ok = phrase_parse(
            f, l, 
            *repo::seek [ eol >> "label" >> char_("A-Z") >> ':' >> int_ ],
            blank,
            parsed
        );

    if (ok)
    {
        std::cout << "Gefunden:\n";
        for (auto& p : parsed)
            std::cout << "'" << p.first << "' hat den Wert " << p.second << "\n";
    }
    else
        std::cout << "Fehler bei: '" << std::string(f,l) << "'\n";
}

Notizen:

Output ist

Gefunden:
'A' hat den Wert 34
'B' hat den Wert 45

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X