передать атрибут дочернего правила в духе буста
У меня есть два правила с одним и тем же атрибутом.
Можно ли передать атрибут правила matrix_ дочернему правилу matrixBlock_? Я хочу, чтобы директива повтора не создавала атрибут вектора формы & lt; & GT ;. Вместо этого он должен просто продолжать записывать в атрибут matrix_ (количество раз numBlocks). Я попытался передать атрибут как унаследованный атрибут в дочернее правило, и он компилируется (см. Ниже). Но я получаю несколько "призраков" записи в моем векторе, которые приходят не от Phoenix :: push_back. Также это, кажется, не оптимальный путь для меня. Возможно ли нам автоматическое распространение атрибутов в matrixBlock_ вместо семантических действий?
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_;
Update
уточнить вопрос:
если я напишу правило без семантических действий, синтезированный атрибут 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_;
Я хочу, чтобы он имел тот же тип атрибута, что и matrixBlock_, одномерный массив.
Мое реальное решение - использовать только одно правило. (выглядит легко :-))
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_;
Update
Я смог воспроизвести фантомные записи с этим кодом в vs2010 и повысить 1.46.1
http://liveworkspace.org/code/505091dc4631a379763567168a728e0c
output was: 42, 45, -9, 3, 2, 1, 12, 34, 56, 0, 0, 0
Моя ошибка заключалась в использовании старой версии Boost. Нет фонтомов с 1.5.
Теперь у меня есть две рабочие версии моей грамматики. Можно ли изменить грамматику без использования семантического действия push_back?