Во всей грамматике 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