簡體   English   中英

換擋和前瞻之間的區別

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM