Скажем, у меня есть такая грамматика 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 каждый возврат дочерних правил зависит отданный Бар унаследованный атрибут.У меня также может быть это для родительского правила:
parent = *child(_r1);
Интересно, возможно ли дочернему правилу изменить унаследованный атрибут, распространить изменение на родительское правило ичтобы новое значение передавалось следующему дочернему правилу.
В приведенном выше примере правило start устанавливает начальное значение для Bar , который будет использоватьсяв родительский и его дочерние правила. Бар изменяется каждый раз, когда он проходит через правило child .Возможно ли это хотя и как будет выглядеть такой код?