我一直在将 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() 完成这项工作。也就是说,如果我输入“命令选择”,它就可以工作,而不仅仅是“选择”。