使用boost.spirit我尝试解析command:param1 param2...
这样做我创建了这个解析器:
(+(char_ - ':'))[ref(cmd) = _1]
>> ':'
>> (*char_)[ref(params) = _1]
两个化合物解析器的属性类型是vector,因此如果cmd和params属于vector类型,则此工作。但是,如果它们是std :: string类型,则不会。在网上搜索这个解决方案时,我发现它也应该与字符串一起使用。无论如何我可以使用字符串来完成这项工作吗?
答案 0 :(得分:7)
当然,当您使用语义动作时,不会发生自动属性传播。您的解析器(+(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);
这不仅更简单,而且更快。解析器将匹配的字符直接放入提供的字符串中。