Разбор строки с помощью Boost Spirit 2 для заполнения данных в определяемой пользователем структуре

Я использую 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 заполнены правильно. но это не так.

Что происходит не так?

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

Заранее спасибо, Сурья


person Surya    schedule 18.03.2010    source источник
comment
Если вы можете опубликовать непрерывный компилируемый фрагмент кода, воспроизводящий вашу проблему, вы можете привлечь больше людей, желающих взглянуть и попытаться помочь.   -  person Emile Cormier    schedule 18.03.2010
comment
Образец исходного кода доступен на сайте pastebin. pastebin.org/117703   -  person Surya    schedule 19.03.2010


Ответы (1)


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_ % ',');

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

person hkaiser    schedule 19.03.2010