使用$ n表示n<在野牛0

时间:2010-01-14 23:04:19

标签: c parsing bison

Bison有办法检查当前的令牌堆栈大小吗?

我想将 $ n n 作为负数来访问语义值另一条规则,但仅限于堆栈足够大。

谢谢。

1 个答案:

答案 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语法是否具有相同含义的相同变量;它可能没有。