1

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

我想使用$nn作为负数来访问另一个规则的语义值,但前提是堆栈足够大。

谢谢你。

4

1 回答 1

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

于 2010-01-15T03:16:52.227 回答