Как и многие из этих других вопросов, я ' 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
они будут совместимы, и это определенно кажется так с точки зрения статического анализа, но данные не сохраняются.
ссылка(& ) обозначение Я где-то что-то пропустил?