Boost.Spirit.Qi: Возьмите атрибут правила и установите его как поле атрибута структуры включающего правила?

Как и многие из этих других вопросов, я ' m пытаюсь преобразовать простую грамматику в дерево структур с помощью Boost.Spirit.Qi.

Я постараюсь выделить то, что я пытаюсь сделать, в простейшем возможном случае. У меня есть:

struct Integer {
  int value;
};
BOOST_FUSION_ADAPT_STRUCT(Integer, (int, value))

Позже, внутри грамматической структуры, у меня есть следующая переменная-член:

qi::rule<Iterator, Integer> integer;

, которую я определяю с помощью

integer = qi::int_;

Однако, когда я пытаюсь фактически проанализировать целое число, используя

qi::phrase_parse(iter, end, g, space, myInteger);

myInteger.value всегда не инициализируется после успешного синтаксического анализа. Точно так же я пробовал следующие определения (очевидно, что те, которые не компилируются, неверны):

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

Ясно, что я неправильно понимаю что-то о Spirit, Phoenix или чем-то еще. Насколько я понимаю, qi :: _ 1 является первым атрибутом qi :: int_ здесь и должен представлять проанализированное целое число, когда часть в квадратных скобках выполняется как функциональный объект. Затем я предполагаю, что функциональный объект примет охватывающий целочисленный атрибут qi :: _ val и попытается присвоить ему проанализированное целое число. Я предполагал, что из-за моего вызова BOOST_FUSION_ADAPT_STRUCT они будут совместимы, и это определенно кажется так с точки зрения статического анализа, но данные не сохраняются.

ссылка(& ) обозначение Я где-то что-то пропустил?

7
задан jtolds 6 January 2011 в 21:23
поделиться