В цялата граматика на 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