Gestion des expressions analysées dans Spirit
Dans cette requête, nous explorons les défis rencontrés lors de l'attribution des analyseurs Spirit à des variables automatiques. Bien qu'un analyseur puisse fonctionner de manière transparente lorsqu'il est utilisé directement avec qi::parse(), des problèmes surviennent lorsque l'analyseur est affecté à une variable automatique et réutilisé.
Le cœur de ce comportement réside dans la manière dont les analyseurs Spirit sont implémentés. . Les modèles d'expression de proto, qui constituent le fondement de Spirit, conservent des références à des variables temporaires. Lorsqu'un analyseur est affecté à une variable automatique, les expressions Proto sous-jacentes établissent également des références aux analyseurs temporaires.
Pour résoudre ce problème, plusieurs options sont disponibles :
Par exemple :
namespace qi = boost::spirit::qi; int main() { auto bracketed_z = qi::copy( '[' >> +qi::char_('z') >> ']' ); // Uses qi::copy() string line = "[z]"; auto p = line.cbegin(); printf("%d", qi::parse(p, line.cend(), bracketed_z)); // Now works with auto variable // Alternative using BOOST_SPIRIT_AUTO BOOST_SPIRIT_AUTO(bracketed_z, '[' >> +qi::char_('z') >> ']'); }
Ces approches résolvent le problème en brisant la chaîne de référence entre l'analyseur et les variables temporaires, permettant ainsi d'utiliser efficacement les variables automatiques avec Spirit analyseurs.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!