定義済みアクション

フレームワークは二つの定義済みセマンティックアクションを持っている。 経験的にこれらのファンクタはとてもよく用いられるので、 ユーザが同様の機能を繰り返し再発明する必要がないように コアフレームワークの一部に含んでいる。

assign(v)

パーサによって渡された値を変数 v に代入する。

使い方の例:

    int i;
    std::string s;
    r = int_p[assign(i)] >> (+alpha_p)[assign(s)];

入力として 123456 "Hello" が与えられたとすると、 assign(i) は数値 123456 を取り出し、 i へ代入する。 それから、 assign(s) が文字列 "Hello" を取り出し、 それを s に代入する。 技術的には、式 assign(v) はセマンティックアクションを生成するテンプレート関数である。 生成されたセマンティックアクションはポリモーフィックであり、 パーサから受け取った引数と互換性がある限りあらゆる型とともに動作すべきである。 これは明白ではないだろうが、文字列はイテレータ firstlast 引数を 受け付けることができる。これらはジェネリックなセマンティックアクション(上述)へと渡される。 実は assign(first, last) メンバ関数を持つあらゆる STL コンテナが利用できる。

ユーザが独自のセマンティックアクションファンクタを書く際の参考と手助けの為に、 assign(v) アクションの実装は以下に示す。 これは理解するのに十分なほど小さくてシンプルなのでここに含めている。

assign_actor クラス

    template <typename T>
    class assign_actor
    {
    public:

        explicit
        assign_actor(T& ref_)
        : ref(ref_) {}

        template <typename T2>
        void operator()(T2 const& val) const
        { ref = val; }

        template <typename IteratorT>
        void
        operator()(IteratorT const& first, IteratorT const& last) const
        { ref.assign(first, last); }

    private:

        T& ref;
    };

assign 関数

    template <typename T>
    inline assign_actor<T> const
    assign(T& t)
    {
        return assign_actor<T>(t);
    }

append(c)

パーサから渡された値をコンテナ c へ追加する。

使い方の例:

    std::vector<int> v;
    r = int_p[append(v)] >> *(',' >> int_p[append(v)]);

上記のコードはコンマで区切られた整数のリストをパースし、その数をベクタ v に追加する。 append(c) はパースされた値(パーサによってセマンティックアクションに渡された引数)をコンテナ c に追加する。 このコンテナは insert(where, value) メンバ関数および end() メンバ関数を持っていなければならない。 手短に言えば、 STL コンテナは append(c) が動作する完璧な候補である。 assign(v) と同様に append(c) はイテレータの組を取ることができる。 この場合、コンテナは二つのメンバ関数 insert(where, first, last)end() を持っていなければならない。 例、 std::vector<std::string> など。



このドキュメントの対象: Boost Version 1.30.0
最新版ドキュメント(英語)