如何使用boost.spirit提取std :: string?

Mat*_*agé 5 c++ boost-spirit boost-phoenix boost-spirit-qi

使用boost.spirit我尝试解析表单的简单命令行 command:param1 param2...

这样做我创建了这个解析器:

(+(char_ - ':'))[ref(cmd) = _1]
>> ':'
>> (*char_)[ref(params) = _1]
Run Code Online (Sandbox Code Playgroud)

两个化合物解析器的属性类型是vector,因此如果cmd和params属于vector类型,则此工作.但是,如果它们是std :: string类型,则不会.在网上搜索这个解决方案时,我发现它也应该与字符串一起使用.无论如何我能用字符串做这个工作吗?

hka*_*ser 8

当然,当您使用语义动作时,不会发生自动属性传播.你的解析器(+(char_ - ':')*char_)都公开了一个std::vector<char>属性.因此,也_1指一个std::vector<char>.如果cmd和它的params实例std::string将无法编译,因为没有定义从a std::vector<char>到a的赋值std::string.

但是,如果你摆脱了语义行为,它将起作用:

std::string s("command:param1 param2");
std::string cmd, params;
parse(s.begin(), s.end(), +~char_(':') >> ':' >> *char_, cmd, params);
Run Code Online (Sandbox Code Playgroud)

这不仅更简单,而且更快.解析器将匹配的字符直接放入提供的字符串中.