2010-10-20 67 views
3

使用boost.spirit我尝试解析形式command:param1 param2...如何使用boost.spirit提取std :: string?

做的简单的命令行所以我建立这个解析器:

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

属性类型这两种化合物的解析器是矢量,因此,如果CMD和params是这种工作的矢量类型。但是,如果它们是std :: string类型,它不会。在网上搜索这个解决方案时,我发现它也应该可以和字符串一起工作。无论如何,我可以使这个工作与字符串?

回答

6

当然,当您使用语义操作时,不会发生自动属性传播。您的解析器(+(char_ - ':')*char_)都会将std::vector<char>作为其属性。因此,_1也是指std::vector<char>。如果cmdparamsstd::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); 

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

相关问题