2010-10-20 5 views
3

En utilisant boost.spirit je tente d'analyser la ligne de commande simple du formulaire command:param1 param2...Comment puis-je extraire une chaîne std :: avec boost.spirit?

de le faire, j'ai créé cet analyseur:

(+(char_ - ':'))[ref(cmd) = _1] 
>> ':' 
>> (*char_)[ref(params) = _1] 

Les types d'attributs de l'analyseur deux composés est un vecteur, donc si cmd et les params sont de type vector ce travail. Cependant, s'ils sont de type std :: string, ce n'est pas le cas. Lors de la recherche de cette solution sur le web, j'ai trouvé que cela devrait aussi fonctionner avec une chaîne. Y at-il de toute façon je peux faire ce travail avec de la ficelle?

Répondre

6

Bien sûr, lorsque vous utilisez des actions sémantiques, aucune propagation d'attribut automatique ne se produit. Les deux analyseurs (+(char_ - ':') et *char_) exposent un attribut std::vector<char>. Par conséquent, _1 fait également référence à std::vector<char>. Si cmd et params sont des instances de std::string, il ne sera pas compilé car aucune affectation d'un std::vector<char> à std::string n'est définie.

Cependant, si vous vous débarrasser des actions sémantiques il fonctionne:

std::string s("command:param1 param2"); 
std::string cmd, params; 
parse(s.begin(), s.end(), +~char_(':') >> ':' >> *char_, cmd, params); 

C'est non seulement plus simple, mais plus rapide aussi. L'analyseur placera les caractères correspondants directement dans les chaînes fournies.

Questions connexes