0

我来自野牛的“.output”文件有许多变量,命名为 $@1、$@2、...、$@38。这些在某种程度上与中间动作规则相关,我正在检查的语法有很多,但在某种程度上我还没有完全辨别。它们代表非终结符号,在某种程度上与中间操作规则相关。我能说的就这些了。

编辑:


input.y(卡通版):

%start  statement

%%

statement:  /* empty */ { print("testA"); }
    |   ';'         { print("testB"); }
    |       statement   { print("testC"); } thing1 thing2 { print("testD"); }
    ;

input.output(卡通版):

0 $accept: statement $end

1 statement: /* empty */
2      | ';'

3 $@1: /* empty */

4 statement: statement $@1 thing1 thing2

10 thing1: /*empty*/
20 thing2: /*empty*/
4

2 回答 2

2

将中间规则动作放入规则中几乎与添加具有空右侧和相同动作(现在是最终动作)的非终结符完全相同,除了动作中语义值的编号. (bison 允许您在生产开始之前使用负索引引用语义值;这是用于中间规则操作的机制,除了 bison 为您计算堆栈偏移量。)

插入的空非终结符是 "named" @1, @2, ...。你会在状态描述中看到这些;看起来每个中间规则操作都已被@i占位符替换(实际上就是这样)。

编辑

事实证明,中间规则动作可能被命名为$@nor @n。根据reader.c第 527 行的有用评论(在 v2.6.5 中,这是我写的最新版本):

  /* If the midrule's $$ is set or its $n is used, remove the `$' from the
     symbol name so that it's a user-defined symbol so that the default
     %destructor and %printer apply.  */

换句话说,如果一个中间规则动作$没有任何值(它既不设置值,也没有任何人使用该值),它的名称中将精确地包含 a;如果它有一个值(我想我的几乎总是这样),那么它的名字中就不会有 a $

谜底解开了,我相信。

于 2012-12-04T06:14:10.517 回答
1

在 Bison 2.3 之前,中间规则动作的匿名符号被命名为@N,但在 Bison 2.4 中它被更改为$@N。见http://lists.gnu.org/archive/html/bison-patches/2006-10/msg00075.html

底线是:如果您看到@N,是时候更新您的 Bison 副本了 :)

于 2012-12-05T08:57:14.590 回答