Показать сообщение отдельно

  #2  
Старый 14.02.2010, 13:41
rudvil
Участник форума
Регистрация: 25.08.2008
Сообщений: 187
Провел на форуме:
2066562

Репутация: 86
По умолчанию

Смог разобраться, может кому-нибуть тоже понадобится.
В моём случае необходимо создать доп. правило с типом std::string, тогда при вызове функции он в качестве параметра передаст отпарсенный std::string.
Код:
void print_str (std::string str) {
    std::cout << "(" << str << ")";
}
void print_num (double num) {
    std::cout << "(" << num << ")";
}
template <typename Iterator>
struct grammar : qi::grammar<Iterator, ascii::space_type> {
    grammar() : grammar::base_type(expression) {
        using qi::double_;
        using qi::alpha;
        using qi::alnum;
        identifier = -('_' >> +alnum) >> alpha >> *alnum;
        expression = term >> *(('+' >> term) | ('-' >> term));
        term = factor >> *(('*' >> factor) | ('/' >> factor) | ('%' >> factor));
        factor = identifier[&print_str] | double_[&print_num] | '(' >> expression >> ')' | ('-' >> factor) | ('+' >> factor);
    }
    qi::rule<Iterator, ascii::space_type>
        expression,
        term,
        factor,
        program;
    qi::rule<Iterator, std::string> identifier;
};
Т.е.
Код:
qi::rule<Iterator, std::string> identifier;
И теперь можно использовать его так
Код:
identifier[&print_str]