ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
 
 
Опции темы Поиск в этой теме Опции просмотра

boost::spirit, извлечение отпарсенного стринга из переменной
  #1  
Старый 05.02.2010, 19:41
rudvil
Участник форума
Регистрация: 25.08.2008
Сообщений: 187
Провел на форуме:
2066562

Репутация: 86
По умолчанию boost::spirit, извлечение отпарсенного стринга из переменной

Вот часть кода
Код:
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 | double_[&print_num] | '(' >> expression >> ')' | ('-' >> factor) | ('+' >> factor);
    }
    qi::rule<Iterator, ascii::space_type>
        identifier,
        expression,
        term,
        factor,
        program;
};
с получением значения из "double_" проблем нет - там все понятно, т.к. в spirit все уже сделано за тебя...
Собственно вопрос, как можно получить содержимое переменной "identifier"?
Т.е. чтобы было примерно так
Код:
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>
        identifier,
        expression,
        term,
        factor,
        program;
};
и соотвественно будет выведено содержимое identifier'a.
В доках про мой случай много чего написано о Phoenix и Bind, но я в эти вещи ещё не "въехал" =/

Последний раз редактировалось rudvil; 05.02.2010 в 19:50..
 
Ответить с цитированием
 





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ