【发布时间】: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