簡體   English   中英

LALR(1)解析器中的沖突解決

[英]Conflict resolution in LALR(1) parser

有關LALR(1)解析器中的沖突的一些問題,主要與解析的細節有關:

  1. 根據教科書中描述的不同LALR(1)解析器,如果遇到移位/減少沖突,那么這是語法不是LALR(1)開頭的標志,對嗎?

  2. 由於從LR(1)到LALR(1)的狀態合並,在有效的 LALR(1)語法中可能會出現減少/減少沖突。

  3. 在YACC和GNU Bison中使用的優先級和關聯性是否引入了幫助解決轉移/減少沖突的工具,對嗎?

  4. 而且,只有在沖突的移位/歸約規則優先級等於超前符號優先級的情況下,解析器才能檢查關聯性,在任何其他情況下,關聯性均無關緊要,對嗎?

我問是因為我不確定100%,並且書中沒有提供有關沖突解決的詳細信息,我在該主題上發現的僅有幾行內容是在GNU Bison手冊中

與上述Bison手冊鏈接有關的問題:

  • 為什么他們聲稱沖突規則先行標記中沒有優先級,選擇是SHIFT? 我認為,如果歸約規則具有任何優先級,那么它將完全沒有優先級地超過前瞻性。
  1. 如果在構造LALR(k)時發現任何沖突(移位/減少或減少/減少),則語法不是LALR(k)。

  2. 從LR(1)到LALR(1)的狀態合並不會產生移位/減少沖突,因此,如果存在沖突,則語法也不是LR(1)。 但這會產生減少/減少沖突。 如果是,則語法不是LALR(1),即使它是LR(1)。 (這實際上不是“有效性”的問題;這是特定算法的可分析性的問題。)

  3. 是的,優先級(和關聯性,這只是優先級的一個子情況)可以解決移位/減少沖突。

  4. 優先級是生產 (左側)和超前標記 (右側)之間的比較。 關聯性會影響所使用的比較運算符:≤或<(或者,對於%nonassoc ,等於錯誤)。

Dragon書籍中對算法進行了精彩的討論。 但是,它不是很復雜:如果生產“獲勝”,則解析器會減少; 否則會發生變化。

額外的問題:僅當為生產(通過%prec或默認情況下,生產中最后一個終端的優先級)和前瞻令牌定義了優先級時,才應用優先級規則。 如果其中任何一個都缺少優先聲明,則shift獲勝。 這看起來似乎不合邏輯,但事實就是如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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