Парсинг строки, с Духом Повышения 2, для заполнения данных в определяемой пользователем структуре

Я использую Повышение. Дух, который был распределен с Повышением 1.42.0 с VS2005. Моя проблема похожа на это.

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

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

Мое правило похоже на это

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

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

struct MyStruct
{
   vector stringVector ;
   vector doubleVector ;
} ;

MyStruct var ;

Я перенес его в BOOST_FUSION_ADAPT_STRUCTURE для использования его с духом.

BOOST_FUSION_ADAPT_STRUCT (MyStruct, (vector, stringVector) (vector, doubleVector))

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

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

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

Что идет не так, как надо?

Пример кода расположен здесь

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

5
задан Surya 19 March 2010 в 07:01
поделиться

1 ответ

qi :: skip_type - это не то, что вы мог использовать шкипера. qi :: skip_type - это тип заполнителя qi :: skip , который применим только для директивы skip [] (чтобы разрешить пропуск внутри лексемы [] или для изменения используемого шкипера) и который не является компонентом анализатора, который сам по себе соответствует какому-либо входу. Вместо этого вам нужно указать конкретный тип шкипера (в вашем случае это 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_ % ',');

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

6
ответ дан 14 December 2019 в 13:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: