2010-03-18 3 views
4

J'utilise Boost.Spirit qui a été distribué avec Boost-1.42.0 avec VS2005. Mon problème est comme ça.Chaîne d'analyse, avec Boost Spirit 2, pour remplir les données dans la structure définie par l'utilisateur

J'ai cette chaîne qui a été délimitée par des virgules. Les 3 premiers champs sont des cordes et le repos sont des nombres. comme ça.

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

Ma règle est comme ça

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

Je suis en train de stocker les données dans une structure comme celui-ci.

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

MyStruct var ; 

Je l'ai enveloppé dans BOOST_FUSION_ADAPT_STRUCTURE de l'utiliser avec l'esprit.

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

Ma fonction d'analyse syntaxique et analyse la ligne retourne vrai et après

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

Je me attends var.stringVector et var.doubleVector sont correctement remplis. mais ce n'est pas le cas.

Qu'est-ce qui ne va pas?

L'exemple de code est situé here

Merci à l'avance, Surya

+1

Si vous pouvez publier un extrait de code continu et compilable reproduisant votre problème, vous pourriez inciter davantage de personnes à jeter un coup d'œil et essayer de vous aider. –

+0

L'exemple de code source est fourni sur le site pastebin. http://www.pastebin.org/117703 – Surya

Répondre

6

qi::skip_type n'est pas quelque chose que vous pouvez utiliser un skipper. qi :: skip_type est le type de l'espace réservé qi::skip, qui s'applique uniquement à la directive skip[] (pour activer le saut dans un lexeme[] ou pour modifier le skipper en cours d'utilisation) et qui n'est pas un composant analyseur correspondant à une entrée en elle-même. Vous devez spécifier votre type de skipper spécifique (dans votre cas, c'est boost::spirit::ascii:space_type).

De plus, pour que vos règles renvoient l'attribut analysé, vous devez spécifier le type de l'attribut attendu lors de la définition de votre règle. Cela vous laisse avec:

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

qui devrait faire exactement ce que vous attendez.

Questions connexes