7

我正在尝试构建具有增强精神的 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 在这种情况下不可用,对吧?(这对我来说有点晦涩难懂,如果这个问题表述得不好,请见谅)

在此先感谢您提供正确方向的任何指针!

4

1 回答 1

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 lambda 对传递的属性做非常简单的事情,事情非常容易,但如果您想访问本地或qi::_val,则必须使用 context 参数。context 是一个非常模板化的实例,boost::spirit::context可让您访问两个boost::fusion序列;属性和本地人。

于 2012-10-01T18:38:35.767 回答