2010-03-17 33 views
3

比方说,我必须定义为像一个语法:使用boost :: spirit解析时,我该如何假设一个“默认值”?

some_rule := a b [c [d]] 

其中c,并d是可选的,默认为一定值(比方说14)如果不给。如果没有给出该值,我可以将它默认为14吗?我想制作std::vector永远是大小的4

我来最接近的是这样的:

qi::rule<Iterator, std::vector<int>(), ascii::space_type> some_rule; 
some_rule %= int_ >> int_ >> -int_ >> -int_; 

// ... 

some_other_rule = some_rule[&some_callback_for_int_vectors]; 

这将进而得到0未露面的可选值(我相信)。然后,我在末尾将连续的0更改为14.这不仅是错误的,而且还不够优雅。有一个更好的方法吗?

回答

6

看起来你可以用boost::qi::attr辅助解析器来做到这一点。

int default_value = 14; 

qi::rule<Iterator, int(),    ascii::space_type> some_optional_rule; 
qi::rule<Iterator, std::vector<int>(), ascii::space_type> some_rule; 

some_optional_rule %= int_ | attr(default_value); 
some_rule   %= repeat(2)[int_] >> repeat(2)[some_optional_rule]; 

我仍然不知道这是最好的方式做到这一点,虽然。

+0

对于第一个答案,你真的没有选择简单! – 2010-03-17 08:53:23

+0

对不起,我不确定我是否明白你的意思... – tJener 2010-03-17 15:18:04

+0

我认为他的意思是这是你已经回答的第一个问题,而问题不完全是C++ 101. :) – Ben 2010-03-17 19:07:12

相关问题