[英]Conflict resolution in LALR(1) parser
有關LALR(1)解析器中的沖突的一些問題,主要與解析的細節有關:
根據教科書中描述的不同LALR(1)解析器,如果遇到移位/減少沖突,那么這是語法不是LALR(1)開頭的標志,對嗎?
由於從LR(1)到LALR(1)的狀態合並,在有效的 LALR(1)語法中可能會出現減少/減少沖突。
在YACC和GNU Bison中使用的優先級和關聯性是否引入了幫助解決轉移/減少沖突的工具,對嗎?
而且,只有在沖突的移位/歸約規則優先級等於超前符號優先級的情況下,解析器才能檢查關聯性,在任何其他情況下,關聯性均無關緊要,對嗎?
我問是因為我不確定100%,並且書中沒有提供有關沖突解決的詳細信息,我在該主題上發現的僅有幾行內容是在GNU Bison手冊中
與上述Bison手冊鏈接有關的問題:
如果在構造LALR(k)時發現任何沖突(移位/減少或減少/減少),則語法不是LALR(k)。
從LR(1)到LALR(1)的狀態合並不會產生移位/減少沖突,因此,如果存在沖突,則語法也不是LR(1)。 但這會產生減少/減少沖突。 如果是,則語法不是LALR(1),即使它是LR(1)。 (這實際上不是“有效性”的問題;這是特定算法的可分析性的問題。)
是的,優先級(和關聯性,這只是優先級的一個子情況)可以解決移位/減少沖突。
優先級是生產 (左側)和超前標記 (右側)之間的比較。 關聯性會影響所使用的比較運算符:≤或<(或者,對於%nonassoc
,等於錯誤)。
在Dragon書籍中對算法進行了精彩的討論。 但是,它不是很復雜:如果生產“獲勝”,則解析器會減少; 否則會發生變化。
額外的問題:僅當為生產(通過%prec
或默認情況下,生產中最后一個終端的優先級)和前瞻令牌定義了優先級時,才應用優先級規則。 如果其中任何一個都缺少優先聲明,則shift獲勝。 這看起來似乎不合邏輯,但事實就是如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.