我正在尝试使用提升精神构建一个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在这种情况下不可用吗? (这对我来说有点模糊,如果这个问题没有很好地表达,那就很抱歉)
提前感谢任何指向正确方向的指针!
答案 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
序列;属性和本地人。