[英]Shift/reduce conflict in yacc grammar
我寫了一個語法,規則如下:
A : B '?'
| B
| A '+' A
;
B : "a"
| "c" A "t" A
;
這給了我一個轉變/減少沖突的機會
A : B . '?' (96)
A : B . (98)
我嘗試了多種方法來更改語法,但是當我嘗試更改內容時,似乎會產生更多沖突。 如何消除此沖突?
預先謝謝您,任何幫助將不勝感激。
LALR(1)解析器使用單字符提前查找來解決其沖突。 當前瞻無法區分不同的動作時,就會向用戶顯示沖突。
在以下狀態下,“?” 前瞻意味着解析器可以移動。
A : B . '?'
A : B .
但是,如果它減少A怎么辦? 可能會減少到以下狀態:
B: "c" A "t" A .
通過減少B可以直接導致:
A : B . '?'
A : B .
因此,“?” 也是減少的有效前瞻。
那么如何解決呢?
您有兩種選擇:
1)嘗試用左遞歸而不是右遞歸重寫語法。 這可能會有所幫助,但是不能保證。
2)告訴YACC每當有沖突時選擇哪個(例如,使用%left或%right)。
或者,也許使用更智能的解析器。 例如elkhound或antlr。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.