Chaîne de l'analyse, avec Spirit Boost 2, pour remplir les données dans struct défini par l'utilisateur

StackOverflow https://stackoverflow.com/questions/2469861

Question

J'utilise Boost.Spirit qui a été distribué avec Boost-1.42.0 avec VS2005. Mon problème est comme ça.

J'ai cette chaîne qui a été delimted par des virgules. Les 3 premiers champs de celui-ci sont des chaînes et autres sont des nombres. comme celui-ci.

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

Ma règle est comme ceci

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é

Merci d'avance, Surya

Était-ce utile?

La solution

qi::skip_type n'est pas quelque chose que vous pouvez utiliser un skipper. qi de skip_type est le type de l'espace réservé qi::skip, qui est applicable à la directive skip[] seulement (pour permettre à sauter dans un lexeme[] ou pour changer le skipper en cours d'utilisation) et qui ne sont pas un composant analyseur correspondant à une entrée lui-même. Vous devez spécifier au lieu de votre type spécifique de skipper (dans votre cas qui est boost::spirit::ascii:space_type).

En outre, pour que vos règles de retourner l'attribut analysé, vous devez spécifier le type de l'attribut prévu tout en définissant 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top