[英]Difference between shifting and look-ahead
給出一個簡單的語法,就像
rule1
:= token1 token2 token3 token4
|| token1 token2 token3 token3;
轉移前三個令牌,然后查看第四個令牌以查看要減少哪個規則,並簡單地執行三個令牌的前瞻以查看要減少哪個規則之間有什么區別?
在shift / reduce解析器中,前瞻不用於確定正在考慮哪個生產,而是用於確定解析器是應該移動下一個令牌還是采取某種reduce操作。 如果您有上述語法的shift / reduce解析器,解析器總是會在決定是否減少之前移動四個令牌; 請記住,在LR解析器中,僅當適當的符號系列位於解析堆棧頂部時才執行縮減。 如果解析器無法判斷它是否應該減少它所擁有的四個標記,或者繼續移動更多符號並在以后減少,那么Lookahead只在這里是必要的。
具體來說,解析器可能會執行以下操作:
Stack Input Action
-------------------------------------------------------------------------------
token1 token2 token3 token4 Shift
token1 token2 token3 token4 Shift
token1 token2 token3 token4 Shift
token1 token2 token3 token4 Shift
token1 token2 token3 token4 Reduce, Option 1
rule1 Accept
要么
Stack Input Action
-------------------------------------------------------------------------------
token1 token2 token3 token3 Shift
token1 token2 token3 token3 Shift
token1 token2 token3 token3 Shift
token1 token2 token3 token3 Shift
token1 token2 token3 token3 Reduce, Option 2
rule1 Accept
請注意,這與LL(k)解析器等自上而下的解析器形成對比,后者通過嘗試預測要使用的生產來工作。 在這種情況下,需要四個先行令牌,因為解析器猜測生產然后檢查其猜測(預測/匹配解析)。 例如,在自上而下的解析器(這里必須是LL(4))中,它將執行以下操作:
Stack Input Action
----------------------------------------------------------------------------------
rule1 token1 token2 token3 token4 $$$$ Predict, Option 1
token1 token2 token3 token4 token1 token2 token3 token4 $$$$ Match
token2 token3 token4 token2 token3 token4 $$$$ Match
token3 token4 token3 token4 $$$$ Match
token4 token4 $$$$ Match
$$$$ Accept
要么
Stack Input Action
----------------------------------------------------------------------------------
rule1 token1 token2 token3 token3 $$$$ Predict, Option 2
token1 token2 token3 token3 token1 token2 token3 token3 $$$$ Match
token2 token3 token3 token2 token3 token3 $$$$ Match
token3 token3 token3 token3 $$$$ Match
token3 token3 $$$$ Match
$$$$ Accept
注意如何預測要使用哪個生產,因此解析器必須有四個前瞻標記。 在LR解析器中,解析器通過檢查更多令牌來工作,直到它看到它正在查找的內容變得舒適,然后減少(移位/減少解析)。 在這種情況下,根本不需要前瞻。 Lookahead僅在LR解析器中需要確定解析器是否已經看到句柄的末尾(要減少的字符串),或者它是否在句柄的中間並且必須保持移位。 這就是為什么,例如,一些有趣的語法可以顯示為LR(0),但唯一的LL(0)語法是語法,其中每個非終結者只有一個與之相關的生成; 前瞻性在自上而下與自下而上的解析中有着根本不同的用途。
一般來說,自上而下的解析器可以處理比自下而上的解析器更少的語法,事實上任何LL(k)語法都保證是LR(k),但不是相反。
希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.