Назначение или изменение унаследованных атрибутов в правиле и распространение результатов в родительское правило - PullRequest
4 голосов
/ 10 июля 2010

Скажем, у меня есть такая грамматика 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 .Возможно ли это хотя и как будет выглядеть такой код?

1 Ответ

3 голосов
/ 10 июля 2010

Унаследованные атрибуты могут передаваться по ссылке:

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));  

, позволяющие достичь именно того, что вы хотите.

...