Я внедряю 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 () выполнять эту работу. То есть, это работает, если я набираю «select», а не просто «select».