【问题标题】:How can I extract a std::string with boost.spirit?如何使用 boost.spirit 提取 std::string?
【发布时间】:2010-10-20 00:58:04
【问题描述】:
使用 boost.spirit 我尝试解析 command:param1 param2... 形式的简单命令行
为此,我创建了这个解析器:
(+(char_ - ':'))[ref(cmd) = _1]
>> ':'
>> (*char_)[ref(params) = _1]
这两个复合解析器的属性类型是vector,所以如果cmd和params是vector类型的就可以了。但是,如果它们是 std::string 类型,则不是。在网上搜索此解决方案时,我发现提示它也应该与字符串一起使用。无论如何我可以使用字符串来完成这项工作吗?
【问题讨论】:
标签:
c++
boost-spirit
boost-spirit-qi
boost-phoenix
【解决方案1】:
当然,当您使用语义操作时,不会发生自动属性传播。您的两个解析器(+(char_ - ':') 和 *char_)都公开了一个 std::vector<char> 作为它们的属性。因此,_1 也指的是std::vector<char>。如果cmd 和params 是std::string 的实例,则不会编译,因为没有定义从std::vector<char> 到std::string 的赋值。
但是,如果您摆脱语义操作,它将起作用:
std::string s("command:param1 param2");
std::string cmd, params;
parse(s.begin(), s.end(), +~char_(':') >> ':' >> *char_, cmd, params);
这不仅更简单,而且更快。解析器会将匹配的字符直接放入提供的字符串中。