4

親ルールが継承された属性をその子に渡す、このような Boost Spirit 文法があるとします。

template <typename Iterator>
struct MyGrammar : qi::grammar<Iterator, vector<Foo>()>
{
    qi::rule<Iterator, vector<Foo>()> start;

    qi::rule<Iterator, vector<Foo>(Bar)> parent;
    qi::rule<Iterator, Foo(Bar)> child1;
    qi::rule<Iterator, Foo(Bar)> child2;

    MyGrammar() : MyGrammar::base_type(start)
    {
        start = parent( Bar(etc) ); // An "initial" value for the Bar passed
                                    // between the following rules.  More on
                                    // that later.

        parent = child1(_r1) >> child2(_r1);
        child1 = ...[do something with _r1];
        child2 = ...[do something with _r1];
    }
};

子ルールが返すそれぞれのFooは、指定されたBar継承属性に依存します。親ルールにもこれがあるかもしれません:

parent = *child(_r1);

私が疑問に思っているのは、子ルールが継承された属性を変更し、変更をその親ルールに伝播し、新しい値を次の子ルールに渡すことができるかどうかです。

上記の例では、開始ルールは、ルールとその子ルールで使用されるBarの初期値を確立します。バーは、ルールを通過するたびに変更されます。これは可能ですが、そのようなコードはどのようになりますか?

4

1 に答える 1

3

継承された属性は、参照によって渡すことができます。

qi::rule<Iterator, vector<Foo>(Bar)> parent;
qi::rule<Iterator, Foo(Bar&)> child1; 
qi::rule<Iterator, Foo(Bar&)> child2; 

と:

parent = child1(phoenix::ref(_r1)) >> child2(phoenix::ref(_r1));  

あなたが望むものを正確に達成することを可能にします。

于 2010-07-10T04:45:42.513 に答える