Heim >Backend-Entwicklung >C++ >Warum verursachen Spirit-Parser, die „auto'-Variablen zugewiesen sind, Probleme und wie kann ich sie beheben?
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:
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!