Я внедрял boost::spirit в проект, и одной из моих задач является парсинг непосредственно в контейнере типа:
map<string, string>
Я почти на месте. Проблема, с которой я столкнулся, заключается в автоматическом присвоении значения ключа std::pair. То есть каждый токен в моей входной строке имеет заранее определенный ключ, и я хочу, чтобы он автоматически вставлялся в пару при анализе токена.
Я думаю, что я близок, но, возможно, нет... Вот (усеченная) грамматика:
command =
string( "select" )
;
key = string( "command" ) | qi::attr( std::string("command") );
command_pair = key >> ' ' >> command;
start =
command_pair >> *command_pair
;
qi::rule<Iterator, std::string()> command;
qi::rule<Iterator, std::pair<std::string, std::string>()> command_pair;
qi::rule<Iterator,parserMap()> start;
Конечным результатом является ввод в командной строке:
select
и попросите синтаксический анализатор вставить «команду» в качестве ключа, как если бы я набрал:
command select
таким образом, доступ к элементу map["command"] вернет значение "select".
Проблема в том, что я не могу заставить qi::attr() выполнять эту работу. То есть работает, если я набираю "выбор команды", а не просто "выбрать".