> 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 в комментарии. Это вызвано смешанным использованием «>>» (анализатора последовательности) и «>» (анализатор ожидания).
два предложения: один вопрос за вопросом, и код должен быть в вопрос. И описать код, описать, что он делает (или не делает), и то, что вы ожидали вместо этого. (И комментарии идут в раздел комментариев, а не в вопрос.) – Mat
@Mat Спасибо. С нетерпением ждем дальнейших предложений. – cqdjyy01234
Вы говорите о двух вещах, которые делают разные вещи. Тем не менее вы показываете только один фрагмент кода и не описываете его. – Mat