我一直在将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”作为键,就好像我输入了一样:
command select
因此,访问map [“command”]元素将返回值“select”。
问题是,我无法让qi :: attr()来完成这项工作。也就是说,如果我输入“command select”,它就有效,但不仅仅是“select”。
答案 0 :(得分:0)
看起来我觉得它比需要的更难。
解决方案在于我没有引用的部分代码。我使用parse而不是phrase_parse()调用我的语法。启用自动跳空。