1

私はspiritlexの例4に示されているコードに基づいて動作するトークンパーサーを作成しました

私のルールの1つは次のようになります

    set_name 
        =   (   tok.set_ >> tok.name_ >> tok.identifier )
            [
                std::cout << val("set name statement to: ") << _3 << "\n"
            ]
        ;

これはうまく機能します。提示されたとき

SET NAME xyz

期待通りに出力します

名前ステートメントを次のように設定します:xyz

今、私は何か便利なことをしたいので、見つけた名前をクラスに保存します。パーサーのセマンティックの例から作業して、このコードを記述します

  class writer
    {
    public:
        void print(string const& s) const
        {
            std::cout << s << std::endl;
        }
    };

  writer w;

  ...

    set_name 
        =   (   tok.set_ >> tok.name_ >> tok.identifier )
            [
                boost::bind( &writer::print, &w, ::_3 )
            ]
        ;

これはコンパイルされません

1> C:\ Program Files \ boost \ boost_1_44 \ boost / bind / bind.hpp(318):エラーC2664:'R boost :: _ mfi :: cmf1 :: operator()(const U&、A1)const':パラメータ2を「bool」から「conststd::basic_string」に変換できません
1>と
1> [
1> R = void、
1> T = eCrew :: rule :: writer、
1> A1 = const std :: string&、
1> U = eCrew :: rule :: writer *
1>]
1>および
1> [
1> _Elem = char、
1> _Traits = std :: char_traits、
1> _Ax = std :: allocator
1>]
1>理由:「bool」から「conststd::string」に変換できません
1>コンストラクターがソース型を取得できないか、コンストラクターのオーバーロード解決があいまいでした

コンパイラがboolからstringに変換しようとしていることに不満を言うのはなぜですか?私が見ることができるブールはありません。

4

1 に答える 1

3

のプレースホルダー

std::cout << val("set name statement to: ") << _3 << "\n"

これはboost::spirit::_3、boost.phoenix v2 プレースホルダーです。のプレースホルダー

boost::bind(&writer::print, &w, ::_3)

boost.bind プレースホルダーです (当然のことです)。

これらのプレースホルダーは、同じ動作を共有することはなく、同じデータを参照することさえありません。フォーム _ Nのフェニックス プレースホルダーは、パーサーの N 番目のサブ属性を参照しますが、バインド プレースホルダーは異なる意味を持ちます。

  • _1 は、パーサーの属性全体を指します
  • _2 はパーサーのコンテキストを参照します
  • _3 はbool&「ヒット」パラメーターを参照します

あなたの場合の最も簡単な解決策は、のboost::phoenix::bind代わりに使用することです。これにより、パーサーの 3 番目のサブ属性を の中で手動で選択する代わりに、boost::bind引き続き使用して参照できます。_3writer::print

または、セマンティック アクションのみをアタッチしtok.identifierて、boost.bind::_1が期待どおりに動作するようにします。

set_name
  = tok.set_
    >> tok.name_
    >> tok.identifier[boost::bind(&writer::print, &w, ::_1)]
;
于 2011-03-29T21:14:54.187 に答える