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

Поиск:

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


Опытный
**


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

Репутация: нет
Всего: 6



Есть строка, в которой лежат вещественные числа. Но некоторые из них могут не появиться, вместо них будет что-то подстановочное, например, '---'. Разумеется, парсер double_ Spirit-а на таком NaN споткнётся. Вроде бы, специально для таких случаев, есть парсер-затычка eps. То есть, можно сделать double_[action] | eps. Но вот следующие числа за таким правилом уже не распознаются. Вот код:
Код

#include <string>
#include <iostream>
//-------------------------------------------------------------------------
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
//-------------------------------------------------------------------------
/*
 g++ -Wall -lboost_date_time ./main.cpp -o ./main
*/
//-------------------------------------------------------------------------
template <typename Iterator>
struct optional_numeric_parser : qi::grammar<Iterator,double(),qi::space_type>
{
  optional_numeric_parser(void) : optional_numeric_parser::base_type(start)
  {
    numeric = qi::double_ | qi::eps;
    start = qi::double_[std::cerr << qi::_1 << std::endl] \
      >> numeric[std::cerr << qi::_1 << std::endl]        \
      >> numeric[std::cerr << qi::_1 << std::endl];
    return;
  }
  qi::rule<Iterator,double(),qi::space_type> start;
  qi::rule<Iterator,double(),qi::space_type> numeric;
};
//-------------------------------------------------------------------------
int main(int argc,char** argv)
{
  std::string str;
  for(int i = 1;i != argc;++i)
  { str += " "; str += argv[i]; }
  std::string::iterator begin = str.begin();
  std::string::iterator end = str.end();
  optional_numeric_parser<std::string::iterator> onp;
  qi::phrase_parse(begin,end,onp,qi::space);
  return 0;
}

При подаче вот такой, например, строки: ./main.exe 24.7 --- 15.3 распознаётся только первое число. Это нормальное поведение парсера? Документацию смотрел, но понимания так и не случилось.
PM MAIL ICQ   Вверх
boostcoder
Дата 10.4.2011, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



ваш код не компилировался. пространство имен не было открыто, и не использовалось явно.
подправил: http://liveworkspace.org/code/492c47dd2204...6ffd32eacad097e
подумаю...

Это сообщение отредактировал(а) boostcoder - 10.4.2011, 20:35
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.2208 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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