7

ブーストスピリットを使用してASTを構築しようとしていますが、C++11ラムダ式をセマンティックアクションとして使用するときに合成引数を構築する方法に苦労しています。

ルールがあるとしましょう:

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

ラムダは合成された引数(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ラムダを使用して、渡された属性で非常に単純なことを実行したい場合は非常に簡単ですが、ローカルまたはにアクセスしたい場合はqi::_val、コンテキストパラメーターを使用する必要があります。コンテキストは非常にテンプレート化されたインスタンスであり、2つのシーケンスboost::spirit::contextにアクセスできます。boost::fusion属性とローカル。

于 2012-10-01T18:38:35.767 に答える