Maison > développement back-end > C++ > le corps du texte

Pourquoi les analyseurs Spirit attribués aux variables « auto » provoquent-ils des problèmes et comment puis-je les résoudre ?

Barbara Streisand
Libérer: 2024-11-21 11:23:13
original
498 Les gens l'ont consulté

Why Do Spirit Parsers Assigned to `auto` Variables Cause Issues, and How Can I Fix Them?

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 :

  • qi ::copy(): Cette méthode, introduite dans le tronc de Boost V2, permet de copier les analyseurs, assurant des copies distinctes et cassant la référence chain.
  • boost::proto::deep_copy:Cette fonction offre des capacités de copie approfondie, qui peuvent également résoudre le problème des références de l'analyseur.
  • BOOST_SPIRIT_AUTO : Cette macro, introduite dans une réponse précédente de Stack Overflow, peut être utilisée comme un raccourci pratique pour copier analyseurs.

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') >> ']');
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal