1. 程式人生 > >關於移進/規約衝突(shift/reduce conflicts)

關於移進/規約衝突(shift/reduce conflicts)

什麼是shift/reduce conflicts?比如下面的文法就有衝突:

expr:      expr - expr      | expr * expr      | - expr

對於輸入:   1 * 2   解析完1後,可以繼續移進 * ,或者根據規則 expr:-expr 規約為 -1。也就是說,解析方式有兩種: -1 * 2 = (-1)*2 或者 -1 * 2 =- (1*2) 雖然結果一樣,但是程式不知道該選擇哪種方式。

之所以衝突,是因為移進和歸約的優先順序沒有確定,即符號 * 和規則 expr: -expr 的優先順序沒有確定,出現了 * 就不知道該移進 * 還是利用規則來歸約了。那麼只要定義了它們的優先順序,就可以解決衝突了。

參考:https://blog.csdn.net/iamagoodguy_/article/details/48499591?utm_source=copy