【问题标题】:Problem with right recursive rules with BisonBison 的右递归规则问题
【发布时间】:2018-11-07 15:51:19
【问题描述】:

我已经用野牛实现了多维数组的管理 这段代码工作,使用左递归规则 然而。手册表明最好使用右侧的那些。链接:Bison Recursive Rules

然而,现在,如果我使用正确的规则,数组就不会被正确解析。 问题是当我使用正确的规则时,内部数组 a[2,3] 返回 4 个维度而不是 2 而另一个数组 x[,] 没有维度。

我的问题是:为什么这段代码不能使用正确的递归规则?

不正确的递归错误规则:

argList
    : expr              {stackNode [ kstack++ ] = $1 ;  }
    | argList ',' expr  {stackNode [ kstack++ ] = $3 ;  }

样本来源:

xy[1, a[2,3] ] =  4  ;

野牛的语法:

argList
    : expr              {stackNode [ kstack++ ] = $1 ;  }
    | expr ',' argList  {stackNode [ kstack++ ] = $1 ;  }
;   

statement                                                
    : tPV
    | expr tPV  { $$=$1; } 
;

expr
    : tINTEGER                  { $$ = new_tINTEGER ( $1 ) ;    }
    | tID '[' argList ']'
    {   
        void** n=(void**) malloc ( sizeof(void**)*kstack ) ;    
        for(int j=0,  i=kstack-1    ;   i>=0    ;   i-- )   n[j++] = (void*) stackNode[i] ;
        $$ = new_tArrayArgList ( $1,kstack,n ) ;
        kstack=0;
    }   
    | expr tEQ      expr            { $$ = new_tBINOP ( tEQ,$1,$3) ;    /*  =   */} 

参考链接:

How to build an Array with Bison/Yacc and a Recursive Rule

Left Recursive Rules in Context Free Grammar

问候 克劳迪奥

【问题讨论】:

  • 请更清楚地了解解析如何未能满足您的期望。如果您遇到的问题是您的堆栈被反向填充,这是可以预料到的,因为减少的顺序。
  • 问题是当我使用右递归规则时,内部数组 a[2,3] 返回 4 维而不是 2。否则使用左递归规则,维或数组都是正确的。 (更新问题)

标签: c recursion bison yacc rules


【解决方案1】:

问题在于您使用全局变量stackNodekstack 来跟踪参数列表。这不是可重入的,因此当您有嵌套的参数列表时,处理内部列表会吸收并破坏外部列表的状态,从而导致垃圾。这与左右递归无关,尽管这两种情况会显示不同的损坏。

解决方案是不使用全局变量——在$$ 中返回必要的值:

argList
    : expr              { $$ = new_empty_deque();
                          push_back($$, $1);  }
    | expr ',' argList  { $$ = $3; push_front($$, $1); }
;   

或者(并且更高级),使用左递归规则:

argList
    : expr              { $$ = new_empty_deque();
                          push_back($$, $1);  }
    | argList ',' expr  { $$ = $1; push_back($$, $3); }
;   

【讨论】:

  • 我已经实现了一个本地堆栈,现在可以工作(右递归或左递归),正如您向我指出的那样,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
相关资源
最近更新 更多