5

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

为此,我创建了这个解析器:

(+(char_ - ':'))[ref(cmd) = _1]
>> ':'
>> (*char_)[ref(params) = _1]

这两个复合解析器的属性类型是向量,所以如果 cmd 和 params 是向量类型,那么这个工作。但是,如果它们是 std::string 类型,则不是。在网上搜索此解决方案时,我发现它也应与字符串一起使用。无论如何我可以用字符串来完成这项工作吗?

4

1 回答 1

9

当然,当您使用语义操作时,不会发生自动属性传播。您的解析器 (+(char_ - ':')*char_) 都将 astd::vector<char>作为它们的属性。因此,也_1指a std::vector<char>。如果cmdparamsstd::string它的实例将不会编译,因为没有定义从 astd::vector<char>到 astd::string的赋值。

但是,如果您摆脱语义操作,它将起作用:

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

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

于 2010-10-20T16:31:10.217 回答