2010-07-10 9 views
3

Dites que j'ai une grammaire Boost Spirit comme celle-ci, où une règle parente transmet un attribut hérité à ses enfants.Affectation ou modification des attributs hérités dans la règle et propagation des résultats à la règle parente

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]; 
    } 
}; 

Le Foo les règles de chaque enfant de retour dépend de la donnée Bar attribut hérité. Je pourrais aussi ce pour la règle de parent:

parent = *child(_r1); 

Ce que je me demande est de savoir si oui ou non il est possible pour une règle de l'enfant à modifier un attribut hérité, propager la modification à sa règle de parent, et ont la La nouvelle valeur est transmise à la règle enfant suivante.

Dans l'exemple ci-dessus, la règle de départ serait l'établissement d'une valeur initiale du Bar qui obtient utilisé dans parent et ses règles enfants. La barre est modifiée chaque fois qu'elle passe par une règle enfant. Est-ce encore possible et à quoi ressemblerait ce code?

Répondre

3

Attributs hérités peuvent être passés par référence:

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

et:

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

permettant d'obtenir exactement ce que vous voulez.