我正在嘗試瞭解shift-reduce解析。假設我們有以下的語法,使用強制操作順序遞歸規則,由ANSI C Yacc grammar啓發:Shift-reduce:何時停止減少?
S: A;
P
: NUMBER
| '(' S ')'
;
M
: P
| M '*' P
| M '/' P
;
A
: M
| A '+' M
| A '-' M
;
我們想用移減少解析解析1 + 2。首先,1被轉換爲NUMBER。我的問題是,它是減少到P,然後M,然後A,然後最終S?它如何知道在哪裏停止?
假設它一直減少到S,然後移動'+'。現在,我們不得不含堆棧:
S '+'
如果我們轉向「2」,削減可能是:
S '+' NUMBER
S '+' P
S '+' M
S '+' A
S '+' S
現在,在最後一行的兩側,S可能是P, M,A或NUMBER,並且從任何組合都是文本的正確表示形式來看,它仍然有效。解析器如何「知道」使它成爲
A '+' M
因此,它可以將整個表達式減少到A,那麼S?換句話說,它是如何知道在轉移下一個令牌之前停止減少的?這是LR分析器生成的關鍵難點嗎?
編輯:的除了問題如下。現在假設我們解析1+2*3
。一些移位/縮小操作如下:
Stack | Input | Operation
---------+-------+----------------------------------------------
| 1+2*3 |
NUMBER | +2*3 | Shift
A | +2*3 | Reduce (looking ahead, we know to stop at A)
A+ | 2*3 | Shift
A+NUMBER | *3 | Shift (looking ahead, we know to stop at M)
A+M | *3 | Reduce (looking ahead, we know to stop at M)
這是正確的(授予,尚未完全解析)?而且,向前看1個符號也告訴我們不要將A+M
減少到A
,因爲這樣做會在閱讀*3
之後導致不可避免的語法錯誤?
對於您提供的語法不是「1 + 2」會產生移位/縮減衝突嗎? – mcabral 2010-04-13 03:14:55
沒有。野牛接受它沒有抱怨(當然包裝%標記NUMBER \ n %% \ n ... \ n %%後)。 – 2010-04-13 03:17:37