親ルールが継承された属性をその子に渡す、このような 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の初期値を確立します。バーは、子ルールを通過するたびに変更されます。これは可能ですが、そのようなコードはどのようになりますか?