Bison有办法检查当前的令牌堆栈大小吗?
我想将 $ n 与 n 作为负数来访问语义值另一条规则,但仅限于堆栈足够大。
谢谢。
答案 0 :(得分:0)
给出如下规则:
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语法是否具有相同含义的相同变量;它可能没有。