我正在尝试为C语言的子集构建语法。在我的一些规则中,我有以下内容(pNode
是union
中定义的指针):
rule : { $<pNode>$ = $<pNode>0; } the rest
但是,在阅读Bison文档之后,似乎可以省略该操作,因为$<pNode>0
已经引用了堆栈中的上一个符号。我对吗?
能够省略动作会很棒,因为它会导致一些不会出现的转移/减少冲突。
答案 0 :(得分:1)
此代码复制值堆栈的顶部值(为此规则创建重复的$1
),因此有可能它是不必要的 - 如果使用任何重复值的所有代码都可以更改为使用未重复的值,如果没有代码尝试修改堆栈上的值(可能,但很少见,并认为非常差的样式)。
问题可能出现在the rest
的操作中 - 如果他们引用$0
和$-1
,那么您可能会遇到问题。如果他们只引用$0
(并且不修改它),那么删除操作可能很好。