Как я могу извлечь std :: string с boost.spirit? - PullRequest
5 голосов
/ 20 октября 2010

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

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

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

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

1 Ответ

8 голосов
/ 20 октября 2010

Конечно, когда вы используете семантические действия, автоматическое распространение атрибутов не произойдет. Оба ваших синтаксических анализатора (+(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);

Это не только проще, но и быстрее. Парсер поместит совпавшие символы прямо в предоставленные строки.

...