Heim >Backend-Entwicklung >C++ >Warum verursachen Spirit-Parser, die „auto'-Variablen zugewiesen sind, Probleme und wie kann ich sie beheben?

Warum verursachen Spirit-Parser, die „auto'-Variablen zugewiesen sind, Probleme und wie kann ich sie beheben?

Barbara Streisand
Barbara StreisandOriginal
2024-11-21 11:23:13554Durchsuche

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

Geparste Ausdrücke in Spirit verwalten

In dieser Abfrage untersuchen wir die Herausforderungen, die beim Zuweisen von Spirit-Parsern zu Autovariablen auftreten. Während ein Parser möglicherweise nahtlos funktioniert, wenn er direkt mit qi::parse() verwendet wird, treten Probleme auf, wenn der Parser einer Auto-Variablen zugewiesen und wiederverwendet wird.

Der Kern dieses Verhaltens liegt in der Art und Weise, wie Spirit-Parser implementiert werden . Proto-Ausdrucksvorlagen, die die Grundlage von Spirit bilden, verwalten Verweise auf temporäre Variablen. Wenn ein Parser einer Auto-Variablen zugewiesen wird, stellen die zugrunde liegenden Proto-Ausdrücke auch Verweise auf die temporären Parser her.

Um dieses Problem zu beheben, stehen mehrere Optionen zur Verfügung:

  • qi ::copy(): Diese im Trunk von Boost V2 eingeführte Methode ermöglicht das Kopieren von Parsern, stellt eindeutige Kopien sicher und unterbricht die Referenz Kette.
  • boost::proto::deep_copy: Diese Funktion bietet Deep-Copy-Funktionen, die auch das Problem von Parser-Referenzen lösen können.
  • BOOST_SPIRIT_AUTO: Dieses Makro, das in einer früheren Stack Overflow-Antwort eingeführt wurde, kann als praktische Abkürzung zum Kopieren verwendet werden Parser.

Zum Beispiel:

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') >> ']');
}

Diese Ansätze lösen das Problem, indem sie die Referenzkette zwischen dem Parser und den temporären Variablen unterbrechen, sodass automatische Variablen effektiv mit Spirit verwendet werden können Parser.

Das obige ist der detaillierte Inhalt vonWarum verursachen Spirit-Parser, die „auto'-Variablen zugewiesen sind, Probleme und wie kann ich sie beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn