Übergebe das Attribut an die Kinder-Regel

Ich habe zwei Regeln mit dem gleichen Attribut.

Ist es möglich, das Attribut der Regel matrix_ an die untergeordnete Regel matrixBlock_ zu übergeben? Ich möchte verhindern, dass die Wiederholungsanweisung ein Attribut des Formularvektors <> erstellt. Stattdessen sollte es einfach weiter in das Attribut von matrix_ (numBlocks's times) schreiben. Ich habe versucht, das Attribut als geerbtes Attribut an die untergeordnete Regel zu übergeben, und es wird kompiliert (siehe unten). Aber ich bekomme mehrere "Ghost" -Einträge in meinem Vektor, die nicht vom phoenix :: push_back stammen. Auch das scheint für mich nicht der optimale Weg zu sein. Ist es uns möglich, Attribute in matrixBlock_ anstelle von semantischen Aktionen automatisch weiterzugeben?

typedef vector<columnT> Matrix;
matrix_ = repeat(numBlocks)[ matrixBlock_(_val) ];
matrixBlock_ = *column[phoenix::push_back(_r1, _1)];

qi::rule<Iterator, Matrix(), ascii::space_type> matrix_;
qi::rule<Iterator, void(Matrix&), ascii::space_type> matrixBlock_;
Aktualisieren

um die frage zu klären:

Wenn ich die Regel ohne semantische Aktionen schreibe, wäre das synthetisierte Attribut von matrix_

vector< vector< columnT > >

-

typedef vector<columnT> Matrix;
matrix_ = repeat(numBlocks)[ matrixBlock_ ];
matrixBlock_ = *column;

qi::rule<Iterator, Matrix(), ascii::space_type> matrix_;
qi::rule<Iterator, Matrix(), ascii::space_type> matrixBlock_;

Ich möchte, dass es den gleichen Attributtyp wie matrixBlock_ hat, ein 1-dimensionales Array.

Meine eigentliche Lösung besteht darin, nur eine Regel zu verwenden. (sieht zu einfach aus :-))

typedef vector<columnT> Matrix;
matrix_ = repeat(numBlocks)[ *column_[ phoenix::push_back(_val, _1) ] ];
//matrixBlock_ = *column;

qi::rule<Iterator, Matrix(), ascii::space_type> matrix_;
//qi::rule<Iterator, Matrix(), ascii::space_type> matrixBlock_;
Aktualisieren

Ich konnte die Phantomeinträge mit diesem Code in vs2010 reproduzieren und 1.46.1 steigern

http://liveworkspace.org/code/505091dc4631a379763567168a728e0c

Die Ausgabe war: 42, 45, -9, 3, 2, 1, 12, 34, 56, 0, 0, 0

Mein Fehler war die Verwendung einer alten Boost-Version. Es gibt keine Phontome mit 1.5.

Jetzt habe ich zwei Arbeitsversionen meiner Grammatik. Ist es möglich, die Grammatik ohne Verwendung der semantischen Aktion push_back umzugestalten?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage