Ich versuche zu verstehen, was "Anfügen" einer semantischen Aktion an einen Parser genau bedeutet, und genauer würde ich gerne verstehen, wann und für welchen Zeitraum die semantische Aktion an die Parser.semantische Aktionen an Parser mit Boost Spirit anhängen
Dazu modifizierte ich leicht das employee.cpp Beispiel der Boost-Geist-Bibliothek auf folgende Weise:
1 °/Es wird eine print()
Funktion, dessen Ausgang nur, wenn verfolgt sie genannt wird:
void print(const struct employee & e) { std::cout << e.surname << "\n"}
2 °/Am Ende des Konstruktors der Klasse employee_parser
, gebunden I die print()
Funktion des start
Parser:
employee_parser() : employee_parser::base_type(start)
{
using qi::int_;
using qi::lit;
using qi::double_;
using qi::lexeme;
using ascii::char_;
quoted_string %= lexeme['"' >> +(char_ - '"') >> '"'];
start %=
lit("employee")
>> '{'
>> int_ >> ','
>> quoted_string >> ','
>> quoted_string >> ','
>> double_
>> '}'
;
start[&print];
}
Obwohl es mir scheint, dass ich den start
Parser mit der semantischen Aktion print
verbunden habe, wie in der Dokumentation angegeben, wird die print()
Funktion nie aufgerufen. Es scheint, dass die semantische Aktion am rechten Ende eines Parsers angehängt werden muss Definition, so oft wie der Parser in der gleichen Definition erscheint. Kann jemand ein wenig mehr dazu ausarbeiten?
Hinweis: Ich bin kein Experte für das Innere von Spirit, das ist genau das, was ich beim Lesen von Dokumenten und bei der Verwendung davon entdeckt habe. Wenn es jemanden gibt, der eine ausführlichere Erklärung geben kann als ich, oder die Spannung in meiner Antwort lösen kann, würde ich gerne lesen. –
Für mich war das klar genug – Heyji