Wie viele dieser anderen Fragen versuche ich eine einfache Grammatik mit Boost.Spirit.Qi in einen Strukturbaum zu zerlegen.Boost.Spirit.Qi: Nimm das Attribut einer Regel und setze es als Feld des struct-Attributs einer umschließenden Regel?
Ich werde versuchen zu destillieren, was ich versuche, um den einfachsten Fall zu erreichen. Ich habe:
struct Integer {
int value;
};
BOOST_FUSION_ADAPT_STRUCT(Integer, (int, value))
Später innerhalb einer Grammatik struct, ich folgende Membervariable haben:
qi::rule<Iterator, Integer> integer;
, die ich mit
integer = qi::int_;
bin definieren Wenn ich versuche, um tatsächlich zu analysieren eine ganze Zahl jedoch unter Verwendung von
qi::phrase_parse(iter, end, g, space, myInteger);
myInteger.value
ist nach einer erfolgreichen Analyse immer nicht initialisiert. In ähnlicher Weise habe ich die folgenden Definitionen versucht (natürlich diejenigen, die falsch sind nicht kompilieren):
integer = qi::int_[qi::_val = qi::_1]; //compiles, uninitialized value
integer = qi::int_[qi::_r1 = qi::_1]; //doesn't compile
integer = qi::int_[phoenix::bind(&Integer::value, qi::_val) = qi::_1]; //doesn't
integer = qi::int_[phoenix::at_c<0>(qi::_val) = qi::_1]; //doesn't
Klar ich etwas über Geist, Phoenix bin Missverständnis, oder etwas anderes. Mein Verständnis ist, dass qi::_1
ist das erste Attribut von qi::int_
, hier, und sollte die geparste Integer darstellen, wenn der Teil in den eckigen Klammern als Funktion Objekt ausgeführt wird. Ich gehe dann davon aus, dass das Funktionsobjekt das umgebende integer
Attribut qi::_val
annehmen und versuchen wird, ihm die geparste ganze Zahl zuzuweisen. Meine Vermutung war, dass aufgrund meines Anrufs BOOST_FUSION_ADAPT_STRUCT
die beiden kompatibel wären, und das scheint aus statischer Analyse sicherlich der Fall zu sein, aber die Daten werden nicht beibehalten.
Gibt es eine Referenz (&) Bezeichnung Ich vermisse irgendwo oder etwas?
Ich habe gerade eine andere Kombination, die kompiliert, obwohl es nicht in initialisierte Daten zur Folge hat: Ich habe einen Konstruktor 'Integer' hinzugefügt, die einen Wert für eine' value' nimmt , dann habe ich meinen 'integer' Parser definiert als 'integer = qi :: long_long [qi :: _ val = phx :: construct (qi :: _ 1)]; ' –
jtolds
oops, ich meine' qi :: int_' – jtolds
mehr Debugging Anmerkungen. In meinem vollständigen Code habe ich tatsächlich 'qi :: rule integer;', was aussieht, als ob es bricht, wenn ich 'Integer' durch' Integer() 'ersetze, und alle Beispiele haben das nachlaufende '()', das ich vernachlässigt habe. Vielleicht wurden die Vorlagenargumente für die "Regel" also vermasselt. Graben. –
jtolds