在整个Bison语法中,我使用了右递归,并且我已经读过左递归更好,因为它不必先构建整个堆栈。语法中的左递归冲突
但是,当我尝试切换到任何一个左递归时,我总是会遇到很多冲突,而且我不明白为什么。
任何人都可以告诉我一个通用的例子,使用左递归而不是正确的会导致冲突(当右递归不会导致冲突时)。然后,切换到左侧以纠正这种冲突时需要做些什么。我认为一个基本的例子将帮助我不仅仅是修正我自己的语法。
编辑:
但我想我应该有一个具体的例子不管怎么说,因为我的理解是不是完整的;-)更改“列表分隔命令”到“命令分隔符列表”少一点解决冲突。
State 9 conflicts: 3 shift/reduce
Grammar
0 $accept: input $end
1 input: error NEWLINE
2 | input NEWLINE
3 | input list NEWLINE
4 | /* empty */
5 list: command
6 | command separator
7 | list separator command
8 separator: SEMI
9 | L_OR
10 | L_AND
11 command: variable_assignment
12 | external_w_redir
13 | external_w_redir AMP
14 | pipeline
15 | pipeline AMP
...
state 9
5 list: command .
6 | command . separator
SEMI shift, and go to state 18
L_AND shift, and go to state 19
L_OR shift, and go to state 20
SEMI [reduce using rule 5 (list)]
L_AND [reduce using rule 5 (list)]
L_OR [reduce using rule 5 (list)]
$default reduce using rule 5 (list)
separator go to state 22
你可以发布一个最小的例子,你观察这种效果吗?我不认为它是这样工作的,我的猜测是你的语法有其他问题。即使左递归效率更高,Bison也不应该存在左递归或右递归问题。 – 2009-11-08 18:22:59
@Thomas Padron-McCarthy:已更新为在调试模式下包含Bison的y.output。 – 2009-11-08 18:24:08