来自bison的我的“.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*/
答案 0 :(得分:2)
在规则中设置中规则操作几乎与添加具有空右侧的非终端和相同操作(现在是最终操作)完全相同,除了语义值的编号在行动中。 (bison允许您在生产开始之前使用负索引来引用语义值;这是用于中规则操作的机制,除了bison为您计算堆栈偏移。)
插入的空非终端被“命名为”@1, @2, ...
。你会在状态描述中看到这些;看起来每个中规则操作都被@i
占位符所取代(事实上已经发生了什么)。
修改强>
事实证明,中规则操作可能被命名为$@n
或@n
。根据{{1}}第527行的有用评论(在v2.6.5中,这是我写的最新版本):
reader.c
换句话说,如果中间规则操作没有任何值(它既不设置值也不使用该值),则其名称中的 /* 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. */
就会正确;如果它有一个值(我猜我几乎总是这样做),那么它的名字就不会有$
。
我相信神秘解决了。
答案 1 :(得分:1)
直到Bison 2.3,中规则动作的匿名符号被命名为@N
,但它在Bison 2.4中被更改为$@N
。见http://lists.gnu.org/archive/html/bison-patches/2006-10/msg00075.html
底线是:如果您看到@N
,那么现在是时候更新您的Bison副本了:)