Bison 野牛,规则开始时的行动

Bison 野牛,规则开始时的行动,bison,Bison,我正在尝试为C语言的一个子集构建语法。在我的一些规则中,我有以下内容(pNode是在union中定义的指针): 规则:{$$=$0;}其余的 但是,在阅读Bison文档之后,似乎可以忽略该操作,因为$0已经引用了堆栈中的前一个符号。我说得对吗 如果能够省略该操作,那就太好了,因为它会导致一些原本不会出现的移位/减少冲突。此代码复制值堆栈上的顶部值(对于此规则,使复制的$1),因此,这可能是不必要的——如果所有使用其中一个复制值的代码都可以更改为使用未复制值,并且如果没有任何代码尝试修改堆栈上的

我正在尝试为C语言的一个子集构建语法。在我的一些规则中,我有以下内容(
pNode
是在
union
中定义的指针):

规则:{$$=$0;}其余的
但是,在阅读Bison文档之后,似乎可以忽略该操作,因为
$0
已经引用了堆栈中的前一个符号。我说得对吗


如果能够省略该操作,那就太好了,因为它会导致一些原本不会出现的移位/减少冲突。

此代码复制值堆栈上的顶部值(对于此规则,使复制的
$1
),因此,这可能是不必要的——如果所有使用其中一个复制值的代码都可以更改为使用未复制值,并且如果没有任何代码尝试修改堆栈上的值(可能,但很少,并且被认为是非常糟糕的样式)


问题可能出现在
其余的
的操作中——如果它们指的是
$0
$-1
,则您可能有问题。如果它们只引用
$0
(并且不修改它),您可能可以删除该操作。

此代码复制值堆栈上的顶部值(对于此规则,复制
$1
),因此,这可能是不必要的——如果所有使用其中一个复制值的代码都可以更改为使用未复制值,并且如果没有任何代码尝试修改堆栈上的值(可能,但很少,并且被认为是非常糟糕的样式)


问题可能出现在
其余的
的操作中——如果它们指的是
$0
$-1
,则您可能有问题。如果他们只引用
$0
(不要修改它),您可能可以删除该操作。

谢谢Chris,这正是我的想法。这种情况是相当“封闭”的,我相信其他规则总是在这之后出现,所以对
$0
的引用总是正确的。谢谢Chris,这正是我所想的。这种情况是相当“封闭”的,我相信其他规则总是在这之后出现,所以对
$0
的引用总是正确的。
rule : { $<pNode>$ = $<pNode>0; } the rest