Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> boost::spirit, вывод содержимого из переменной 
V
    Опции темы
rudvil
Дата 5.2.2010, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 2
Всего: 3



Вот часть кода
Код
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, но я в эти вещи ещё не "въехал" =/
--------------------
xor
PM MAIL Skype   Вверх
bsa
Дата 8.2.2010, 15:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



rudvil, тебе нужно будет собрать его по частям: identifier = -('_' >> +alnum[alnum_a]) >> alpha[alpha_a] >> *alnum[alnum_a];
PM   Вверх
rudvil
Дата 8.2.2010, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 2
Всего: 3



Цитата(bsa @ 8.2.2010,  14:19)
rudvil, тебе нужно будет собрать его по частям: identifier = -('_' >> +alnum[alnum_a]) >> alpha[alpha_a] >> *alnum[alnum_a];

Если я правильно понял, то выхода всего два:
Склеивать "совпавшие" символы в 1 стринг, или же сохранять позиции итераторов после найденного в моём случае "identifier'a".
В любом случае спасибо за информацию.
Пойду изучать примеры... т.к. методом тыка. далеко не уйду)))
--------------------
xor
PM MAIL Skype   Вверх
rudvil
Дата 14.2.2010, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 2
Всего: 3



Смог разобраться, может кому-нибуть тоже понадобится.
В моём случае необходимо создать доп. правило с типом 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]

--------------------
xor
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0487 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.