Предоставление значений по умолчанию для атрибутов парсера в boost::spirit

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


person Joel Graff    schedule 28.01.2012    source источник


Ответы (1)


Казалось бы, я усложняю задачу больше, чем нужно.

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

person Joel Graff    schedule 28.01.2012