Разбор строки с Boost Spirit 2 для заполнения данных в определенной пользователем структуре - PullRequest
5 голосов
/ 18 марта 2010

Я использую Boost.Spirit, который распространялся с Boost-1.42.0 с VS2005. Моя проблема такова.

У меня есть строка, разделенная запятыми. Первые 3 поля - это строки, а остальные - числа. как это.

String1,String2,String3,12.0,12.1,13.0,13.1,12.4

Мое правило таково

qi::rule<string::iterator, qi::skip_type> stringrule = *(char_ - ',')
qi::rule<string::iterator, qi::skip_type> myrule= repeat(3)[*(char_ - ',') >> ','] >> (double_ % ',') ;

Я пытаюсь сохранить данные в такой структуре.

struct MyStruct
{
   vector<string> stringVector ;
   vector<double> doubleVector ;
} ;

MyStruct var ;

Я обернул его в BOOST_FUSION_ADAPT_STRUCTURE, чтобы использовать его с духом.

BOOST_FUSION_ADAPT_STRUCT (MyStruct, (vector<string>, stringVector) (vector<double>, doubleVector))

Моя функция разбора анализирует строку и возвращает true и после

qi::phrase_parse (iterBegin, iterEnd, myrule, boost::spirit::ascii::space, var) ;

Я ожидаю, что var.stringVector и var.doubleVector заполнены правильно. но это не тот случай.

Что не так?

Пример кода находится здесь

Заранее спасибо, Surya

1 Ответ

6 голосов
/ 19 марта 2010

qi::skip_type это не то, что вы могли бы использовать шкипер. qi :: skip_type - это тип заполнителя qi::skip, который применим только для директивы skip[] (для включения пропуска внутри lexeme[] или для изменения используемого шкипера) и который не является компонентом синтаксического анализатора, соответствующим любому входу сам по себе. Вместо этого вам нужно указать свой конкретный тип шкипера (в вашем случае это boost::spirit::ascii:space_type).

Кроме того, чтобы ваши правила возвращали проанализированный атрибут, вам нужно указать тип ожидаемого атрибута при определении вашего правила. Это оставляет вас с:

qi::rule<string::iterator, std::string(), ascii:space_type> 
    stringrule = *(char_ - ',');
qi::rule<string::iterator, MyStruct(), ascii:space_type> 
    myrule = repeat(3)[*(char_ - ',') >> ','] >> (double_ % ',');

, который должен делать именно то, что вы ожидаете.

...