在整个 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