Frage

Ich verwende Boost.Spirit die mit boost-1.42.0 mit VS2005 verteilt wurde. Mein Problem ist, wie diese.

Ich habe diese Zeichenfolge, die mit Komma delimted wurde. Die ersten drei Felder davon sind Strings und Rest Zahlen sind. wie diese.

String1,String2,String3,12.0,12.1,13.0,13.1,12.4

ist meine Regel wie diese

qi::rule<string::iterator, qi::skip_type> stringrule = *(char_ - ',')
qi::rule<string::iterator, qi::skip_type> myrule= repeat(3)[*(char_ - ',') >> ','] >> (double_ % ',') ;

Ich versuche, die Daten in einer Struktur wie folgt zu speichern.

struct MyStruct
{
   vector<string> stringVector ;
   vector<double> doubleVector ;
} ;

MyStruct var ;

Ich habe es in BOOST_FUSION_ADAPT_STRUCTURE wickelte es zu verwenden, um mit Geist.

BOOST_FUSION_ADAPT_STRUCT (MyStruct, (vector<string>, stringVector) (vector<double>, doubleVector))

Meine Parse-Funktion analysiert die Linie und gibt true zurück, und nach

qi::phrase_parse (iterBegin, iterEnd, myrule, boost::spirit::ascii::space, var) ;

Ich erwarte var.stringVector und var.doubleVector richtig gefüllt. aber es ist nicht der Fall.

Was nicht in Ordnung ist?

Der Beispielcode befindet sich hier

Vielen Dank im Voraus, Surya

War es hilfreich?

Lösung

qi::skip_type ist nicht etwas, das Sie einen Skipper nutzen könnten. qi :: skip_type ist die Art des Platzhalter qi::skip, die nur für die Richtlinie skip[] anwendbar ist (um zu ermöglichen, innerhalb eines lexeme[] oder Änderungen in Skipper Verwendung Skipping) und bei dem es keinen Parser-Komponente eines beliebige Eingabe auf einem eigenen übereinstimmt. Sie benötigen eine spezifische Skipper Typ statt angeben (in Ihrem Fall, dass boost::spirit::ascii:space_type ist).

Darüber hinaus, um für Ihre Regeln des syntaktisch Attribut zurückzukehren, müssen Sie die Art des erwarteten Attribut angeben, während die Regel definieren. Das lässt Sie mit:

qi::rule<string::iterator, std::string(), ascii:space_type> 
    stringrule = *(char_ - ',');
qi::rule<string::iterator, MyStruct(), ascii:space_type> 
    myrule = repeat(3)[*(char_ - ',') >> ','] >> (double_ % ',');

, die genau tun sollten, was Sie erwarten.

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