2014-01-31 4 views
1

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

я придумал с кодом, как:

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 ], как и предполагалось.

ответ

2

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

Не уверен, что это будет исправить, но попробовать: (. Обратите внимание на добавленную + до того char_)

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

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

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

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

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

Создание результатов изменение правила в '[65, 66, 67, 49, 48, 68, 69, 70, 50, 48] ', поэтому это на самом деле хуже, потому что теперь даже целые числа входят как символы ASCII. – eco

+0

Также, char_ должен преобразовать в std :: string просто отлично. Документы Boost Spirit делают это несколько раз. – eco

+0

Что делать, если вы определяете приоритет «цифры»? т. е. 'digit - + char_'? –