Повышение духа грамматики на основе разделения строк - PullRequest
3 голосов
/ 26 сентября 2011

Я использую Boost 1.44, анализатор Spirit хорошо работает для числового анализа, но действительно сложен для анализа строк. Я пытаюсь разобрать строку, которая будет разделена, используя несколько разделителей: ',', ';' или же ' '. Это хорошо работает для чисел, когда я делаю это (где vect = vector ):

qi::parse(first,last,double_ >> *(',' >> double_  | ' ' >> double_ | ';' >> double_),

Vect, пространство);

Однако, когда я изменяю грамматику для строк, используя vect = vector ,

+char_ >> *(',' >> +char_  | ' ' >> +char_ | ';' >> +char_)

Я получаю следующую ошибку:

/usr/include/boost/spirit/home/qi/detail/assign_to.hpp:109:13: error: invalid conversion from ‘char’ to ‘const char*’/usr/include/boost/spirit/home/qi/detail/assign_to.hpp:109:13: error:   initializing argument 1 of ‘std::basic_string<_CharT, _Traits,_Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]’

Я сузил ошибку до первого + char_ в грамматическом синтаксисе, который воспринимается как последовательность символов, а не как строка. Есть ли способ исправить эту проблему?

Спасибо

1 Ответ

7 голосов
/ 27 сентября 2011

Обработка строк (как вы это делаете) стала намного проще с более свежими версиями Spirit.Я бы предложил использовать Spirit из Boost V1.47, который был переписан в коде обработки атрибутов.

Но даже если он скомпилирован так, как вы хотите, он не будет анализировать, как вы ожидаете.Дух по своей природе жадный, это означает, что +char_ будет поглощать все, что остается на вашем входе безоговорочно.Кажется, было бы лучше иметь

+~char_(", ;") % char_(", ;")

, т.е. один или несколько (+) символов, которые не (~) в наборе ", ;", смешаны с ровно одним из этих символов.Синтаксический анализатор списка (%) предоставляет vector<A>, где A является атрибутом левого выражения, a vector<string> в случае выше.

...