Bison 有没有办法检查当前的令牌堆栈大小?
我想使用$n和n作为负数来访问另一个规则的语义值,但前提是堆栈足够大。
谢谢你。
给定一个规则,例如:
stmt: ID '=' DIGIT
{ $$ = $3; }
;
生成的代码片段是:
{ (yyval) = (yyvsp[(3) - (3)]); }
因此yyvsp
,“数组”是答案的一部分。进一步向上(常规 - 不是 GLR)生成的代码,您会发现它yyvsp
实际上是一个指针,而不是一个数组。例如:
yyvsp = yyvs + yysize - 1;
看起来yysize
是您想要的值;不幸的是,它是一个块的局部变量,在用户操作执行之前已经终止,所以它不能直接使用。但是,您也可以通过以下方式找到代码:
yyvsp = yyvs;
查看代码,它似乎yyvs
是指向堆栈底部的指针(可以动态分配),并且yyvsp
是堆栈向上的指针。这些变量在整个yyparse()
函数中都是可见的(因此,特别是在用户操作中可见。您需要的答案是:
int nrules = yyvsp - yyvs;
像这样戳源代码并不是很干净,但它确实可以为您提供答案。
如果使用 GLR 语法,则必须检查 Bison GLR 语法是否具有相同含义的相同变量;它可能不会。