Parsing-String, mit Boost-Spirit 2, um Fülldaten in benutzerdefinierter Struktur
-
20-09-2019 - |
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
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.