Извлечение неограниченного числа строк и целых чисел с помощью Boost Spirit

Я пытаюсь преобразовать строку как "ABC10DEF20" в массив ["ABC", 10, "DEF", 20] используя Boost Spirit. Я не уверен, что «undelimited» является правильным термином, но я хочу разбить его на границы целых и нецелых чисел, а не разбивать его пробелами или другими символами-разделителями.

Я придумал код вроде:

std::string search_str = "ABC10DEF20";
std::vector<boost::variant<std::string, unsigned int> > v;
std::string::const_iterator iter = search_str.begin();
std::string::const_iterator last = search_str.end();

bool r = parse(iter, last,
+(+(char_ - digit)|uint_),
v);

Для ввода "ABC10DEF20" это приводит к [ 65, 66, 67, 10, 68, 69, 70, 20 ] (без строк, только целые числа и компоненты ASCII строковой части, хранящиеся в целых числах). Для ввода "10" я получил [ 10 ] как предполагалось.

1

Решение

Из результатов видно, что вы сопоставляете отдельные символы, а не строки и целые целые числа без знака.

Не уверен, что это все исправит, но попробуйте:

bool r = parse(iter, last,
+(+(+char_ - digit)|uint_),
v);

(Обратите внимание на добавленный + до char_.)

Тип v может потребоваться изменить, чтобы быть:
std::vector<boost::variant<std::vector<char>, unsigned int> > v;и вам, возможно, придется исправить результат. Не очень знаком с Boost Spirit; Бьюсь об заклад, есть лучший, более чистый способ.

Окончательное решение:

Измените выражение анализа для использования:

+(as_string[+(char_ - digit)]|uint_)
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]