我正在尝试使用提升精神构建一个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在这种情况下不可用吗?(这对我来说有点模糊,如果这个问题没有很好地表达,那就很抱歉)
提前感谢任何正确方向的指针!
这似乎可以解决问题: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);
}];
Run Code Online (Sandbox Code Playgroud)
这里最重要的部分是typedef及其
context_type.如果你只想使用C++ 11 lambdas用你传递的属性做很简单的事情就很容易了,但如果你想要访问本地或者qi::_val你需要使用context参数.context是一个非常模板化的实例,boost::spirit::context它允许您访问两个boost::fusion序列; 属性和本地人.
| 归档时间: |
|
| 查看次数: |
898 次 |
| 最近记录: |