【问题标题】:Assigning or modifying inherited attributes in rule and propagating results to parent rule分配或修改规则中的继承属性并将结果传播到父规则
【发布时间】:2010-07-10 03:25:26
【问题描述】:

假设我有一个像这样的 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);

我想知道的是子规则是否可以修改继承的属性,将修改传播到其父规则,并将新值传递给下一个子规则。

在上面的例子中,start 规则将为 parent 及其子规则中使用的 Bar 建立一个初始值. Bar 每次通过 child 规则时都会被修改。这甚至可能吗?这样的代码会是什么样子?

【问题讨论】:

    标签: boost boost-spirit boost-spirit-qi


    【解决方案1】:

    继承的属性可以通过引用传递:

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

    允许实现你想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多