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