2010-10-20 37 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); 

這不僅是簡單的,但也更快。解析器會將匹配的字符直接放入提供的字符串中。

相關問題