C 带Bison的右递归规则问题

C 带Bison的右递归规则问题,c,recursion,bison,yacc,rules,C,Recursion,Bison,Yacc,Rules,我已经用bison实现了多维数组的管理 这段代码使用左递归规则工作 然而手册指出最好使用右边的。链接: 但是,如果我使用正确的规则,那么数组的解析就不正确。 问题是,当我使用正确的规则时,内部数组a[2,3]返回4维而不是2维,而另一个数组x[,]没有维度 我的问题是:为什么这段代码不能使用正确的递归规则 不正确的递归错误规则: argList : expr {stackNode [ kstack++ ] = $1 ; } | argList ','

我已经用bison实现了多维数组的管理 这段代码使用左递归规则工作 然而手册指出最好使用右边的。链接:

但是,如果我使用正确的规则,那么数组的解析就不正确。
问题是,当我使用正确的规则时,内部数组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) ;    /*  =   */} 
参考链接:

问候
Claudio

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

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

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

请更清楚地说明解析如何未能满足您的期望。如果问题是堆栈是向后填充的,这是意料之中的,因为进行缩减的顺序。问题是,当我使用正确的递归规则时,内部数组a[2,3]返回4维而不是2维。对于左递归规则,维度或数组都是右的。(更新问题)我已经实现了一个本地堆栈,现在可以工作了(右递归或左递归),正如您向我指出的,谢谢。