C 带Bison的右递归规则问题
我已经用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 ','
问题是,当我使用正确的规则时,内部数组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维。对于左递归规则,维度或数组都是右的。(更新问题)我已经实现了一个本地堆栈,现在可以工作了(右递归或左递归),正如您向我指出的,谢谢。