Предоставление значений по умолчанию для атрибутов парсера в boost :: spirit - PullRequest
0 голосов
/ 28 января 2012

Я внедряю 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».

1 Ответ

0 голосов
/ 28 января 2012

Может показаться, что я делал это сложнее, чем нужно.

Решение заключалось в части кода, которую я не цитировал.Я вызывал свою грамматику, используя parse, а не фразу_parse ().Включение автоматического пропуска.

...