Я хотел бы создать правило повышения духа, которое анализирует строку и число с плавающей точкой. Строки, которые я хотел бы проанализировать, отформатированы так:
(str astring)(n 123)
или также может быть в другом порядке:
(n 123)(str astring)
Я хотел бы создать правило с атрибутом следующего типа:
qi::rule<Iter, boost::fusion::vector<std::string, float>, ascii::space_type> hj;
Пока это мой код:
qi::rule<Iter, std::string(), ascii::space_type> attr;
attr = lexeme[*alnum];
qi::rule<Iter, boost::fusion::vector<std::string, float>, ascii::space_type> hj;
hj = (
'(' >> lit("str") >> attr(/*put this at position 0*/) >> ')'
|
'(' >> lit("n") >> float_[/*put this at position 1*/] >> ')'
);
Очевидно, что это не компилируется (boost выводит другой тип атрибута). Как я могу реализовать это, особенно, что бы я положил в прокомментированный код?
Вы можете использовать оператор перестановки ^
, Минимальный рабочий пример:
boost::fusion::vector<std::string,float> ans;
bool res = phrase_parse(first,last,
(lit("(") >> lit("str") >> lexeme[*ascii::alnum] >> lit(")") ) ^
(lit("(") >> lit("n") >> float_ >> lit(")") ),
ascii::space,ans);
Это решение описано более подробно Вот.
Других решений пока нет …