2010-03-18 6 views
4

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

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

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)) 

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

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

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

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

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

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

+1

Если вы можете опубликовать непрерывный, компилируемый фрагмент кода, воспроизводящий вашу проблему, вы можете получить больше людей, желающих взглянуть и попытаться помочь. –

+0

Образец исходного кода предоставляется на сайте pastebin. http://www.pastebin.org/117703 – Surya

ответ

6

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^