2013-11-27 1 views
2

Я хотел бы создать правило повышения духа, которое анализирует строку и поплавок. Струны Я хотел бы разобрать отформатированы, как это:Boost spirit or order

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

ответ

2

Оператор перестановок ^. Минимальный рабочий пример:

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); 

Это решение описывается более подробно here.

+1

+1. [Здесь] (http://coliru.stacked-crooked.com/a/4b0a0abfe1669615) является полным примером. Важно отметить, что синтаксический анализатор перестановок также соответствует одному элементу '(n number)' или одному символу '(str string)', заполняющему построенный по умолчанию элемент, который отсутствует. – llonesmiz