У меня есть следующий код:
#include <boost/spirit/home/x3.hpp>
#include <boost/spirit/home/x3/support/ast/variant.hpp>
struct printer {
template <typename int_type>
void operator()(std::vector<int_type> &vec) {
std::cout << "vec(" << sizeof(int_type) << "): { ";
for( auto const &elem : vec ){
std::cout << elem << ", ";
}
std::cout << "}\n";
}
};
template <typename Iterator>
void parse_int_list(Iterator first, Iterator last) {
namespace x3 = boost::spirit::x3;
x3::variant<vector<uint32_t>, vector<uint64_t>> vecs;
x3::parse( first, last,
(x3::uint32 % '|') | (x3::uint64 % '|'), vecs );
boost::apply_visitor(printer{}, vecs);
}
Я ожидал, что сначала попытается выполнить синтаксический анализ входных данных в 32-битном векторе uint, а затем в случае сбоя в 64-битном векторе uint.Это прекрасно работает, если первое целое число в списке соответствует типу, который достаточно велик для чего-либо еще в списке.Т.е.,
string ints32 = "1|2|3";
parse_int_list(being(ints32), end(ints32))
// prints vec(4): { 1, 2, 3, }
string ints64 = "10000000000|20000000000|30000000000";
parse_int_list(being(ints64), end(ints64))
// prints vec(8): { 10000000000, 20000000000, 30000000000, }
Однако это не работает, когда первое число является 32-разрядным, а позднее - 64-разрядным.
string ints_mixed = "1|20000000000|30000000000";
parse_int_list(being(ints_mixed), end(ints_mixed))
// prints vec(4): { 1, }
Возвращаемое значение x3::parse
указываетпарсинг сбой .Но согласно моему прочтению документации следует попробовать второй вариант, если он не может проанализировать первый.
Любые указатели на то, как я читаю это неправильно, и какальтернативный парсер на самом деле работает?
Редактировать : После просмотра ответов я понял, что x3::parse
фактически возвращает анализ success .Я проверял, что он проанализировал весь поток, first == last
, чтобы определить успех, как показано в документации.Тем не менее, это скрывает тот факт, что благодаря жадной природе чистой звезды и отсутствию привязки к концу потока, она была в состоянии успешно проанализировать часть входных данных.Спасибо всем.