Как я могу извлечь std::string с помощью boost.spirit?

Используя boost.spirit, я пытаюсь разобрать простую командную строку вида command:param1 param2...

для этого я создал этот парсер:

(+(char_ - ':'))[ref(cmd) = _1]
>> ':'
>> (*char_)[ref(params) = _1]

Типы атрибутов двух составных синтаксических анализаторов являются векторными, поэтому, если cmd и params имеют векторный тип, это работает. Однако, если они имеют тип std::string, это не так. При поиске этого решения в Интернете я нашел подсказку, что оно также должно работать со строкой. В любом случае я могу заставить это работать со строкой?


person Mathieu Pagé    schedule 20.10.2010    source источник


Ответы (1)


Конечно, когда вы используете семантические действия, автоматическое распространение атрибутов не происходит. Оба ваших парсера (+(char_ - ':') и *char_) выставляют std::vector<char> в качестве своего атрибута. Следовательно, _1 также относится к std::vector<char>. Если cmd и params являются экземплярами std::string, они не будут компилироваться, так как не определено назначение от std::vector<char> к std::string.

Однако, если вы избавитесь от семантических действий, это сработает:

std::string s("command:param1 param2");
std::string cmd, params;
parse(s.begin(), s.end(), +~char_(':') >> ':' >> *char_, cmd, params);

Это не только проще, но и быстрее. Синтаксический анализатор поместит совпавшие символы непосредственно в предоставленные строки.

person hkaiser    schedule 20.10.2010