如何从提升精神中的C ++ 11 lambda语义动作构建合成参数?

时间:2012-10-01 17:49:22

标签: boost-spirit

我正在尝试使用提升精神构建一个AST,并且当使用C ++ 11 lambda表达式作为语义动作时,我一直在努力构建合成参数。

说我有一条规则:

qi::rule<char*,ascii::space_type,SomeStruct()> rule = some_parser[[](some_type val){/*code to build SomeStruct from val*/}];

我的lambda如何返回合成参数(SomeStruct)?按返回值?因为qi :: _ val在这种情况下不可用吗? (这对我来说有点模糊,如果这个问题没有很好地表达,那就很抱歉)

提前感谢任何指向正确方向的指针!

1 个答案:

答案 0 :(得分:7)

这似乎可以解决问题:http://ereethahksors.blogspot.fr/2012/05/using-c11-lambdas-with-boostspiritqi.html

相关引用:

typedef rule<Iterator, Label*(), space_type> label_rule_type;  
 label = lit(':') > symbol[[&](string& name, typename label_rule_type::context_type& context)   
          {   
           boost::fusion::at_c<0>(context.attributes) = _ast->addLabel(name);  
          }];  
  

这里最重要的部分是typedef及其context_type。如果你只想使用C ++ 11 lambdas用你传递的属性做很简单的事情就很容易,但如果你想要访问本地或qi::_val,你将不得不使用context参数。 context是boost::spirit::context的一个非常模板化的实例,它允许您访问两个boost::fusion序列;属性和本地人。