2015-05-30 2 views
-1

> qi::double_ v.s. >> qi::double_Смешанное использование анализатора последовательности и анализатора ожидающих результатов

Я хочу, чтобы разобрать следующую строку

"***: @a_-091 , *** 1" 

на структуру определяется как

using type = boost::fusion::vector<char, int, double>; 

Когда анализатор

*qi::omit[qi::char_ - '@'] >> '@' >> qi::char_ >> '_' >> qi::int_ >> *qi::omit[qi::char_ - qi::digit] >> qi::double_ 

используется, то результат будет ОК. Однако результат полностью отличается от следующего синтаксического анализатора

*qi::omit[qi::char_ - '@'] >> '@' >> qi::char_ >> '_' >> qi::int_ >> *qi::omit[qi::char_ - qi::digit] > qi::double_ 

Ниже приведен пример кода.

#include <vector> 
    #include <sstream> 
    #include <iostream> 
    #include <boost/spirit/include/qi.hpp> 
    #include <boost/spirit/include/qi_match.hpp> 
    #include <boost/fusion/include/io.hpp> 

    using type = boost::fusion::vector<char, int, double>; 

    int main() { 
     std::istringstream istr{ 
      "***: @a_-091 , *** 1" 
     }; 

     std::vector<type> data; 

     namespace qi = boost::spirit::qi; 
     istr >> std::noskipws >> qi::match(*(
      *qi::omit[qi::char_ - '@'] >> '@' >> qi::char_ >> '_' >> qi::int_ >> *qi::omit[qi::char_ - qi::digit] > qi::double_ 
      ), data); 
     // istr >> std::noskipws >> qi::match(*(
      *qi::omit[qi::char_ - '@'] >> '@' >> qi::char_ >> '_' >> qi::int_ >> *qi::omit[qi::char_ - qi::digit] >> qi::double_ 
      ), data); 

     for (size_t i = 0; i != data.size(); ++i) { 
      std::cerr << data[i] << "\n"; 
     } 

     return 0; 
    } 

PS: Проблема была решена с помощью ссылки, доказанной cv_and_he в комментарии. Это вызвано смешанным использованием «>>» (анализатора последовательности) и «>» (анализатор ожидания).

+0

два предложения: один вопрос за вопросом, и код должен быть в вопрос. И описать код, описать, что он делает (или не делает), и то, что вы ожидали вместо этого. (И комментарии идут в раздел комментариев, а не в вопрос.) – Mat

+0

@Mat Спасибо. С нетерпением ждем дальнейших предложений. – cqdjyy01234

+0

Вы говорите о двух вещах, которые делают разные вещи. Тем не менее вы показываете только один фрагмент кода и не описываете его. – Mat

ответ

0

Как быстрая подсказка, возможно, вы можете переписать с помощью >>.

Чтобы еще есть точки ожидание возможно, вы можете написать

a >> b > c 

как

a >> b >> (c > eps) 

Я проверю это позже

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