我正在爲我設計的語言構建解析器,其中類型名稱以大寫字母開頭,變量名稱以小寫字母開頭,這樣詞法分析器可以告訴差異並提供不同的令牌。此外,字符串'this'被詞法分析器識別(它是一種OOP語言)並作爲單獨的標記傳遞。最後,數據成員只能在「這個」物體上訪問,所以我建立了語法像這樣:簡單語法的野牛移位/減少衝突
%token TYPENAME
%token VARNAME
%token THIS
%%
start:
Expression
;
Expression:
THIS
| THIS '.' VARNAME
| Expression '.' TYPENAME
;
%%
表達的第一條規則允許用戶通過「這個」圍繞作爲值(例如,從方法返回或傳遞給方法調用)。第二個是訪問「this」的數據。第三個規則是調用方法,但是我刪除了括號和參數,因爲它們與問題無關。最初的語法顯然比這個要大得多,但是這是產生相同錯誤的最小部分(1 Shift/Reduce衝突) - 我將它隔離到它自己的解析器文件中並驗證了這一點,所以錯誤與任何事情沒有任何關係其他符號。
據我所見,這裏給出的語法是明確的,所以不應該產生任何錯誤。如果刪除三條規則中的任何一條或將第二條規則更改爲
Expression '.' VARNAME
沒有衝突。無論如何,我可能需要有人來闡明這種衝突發生的原因以及如何解決它。
你如何驗證你的yacc文件等價於原始文件?@ acidzombie24 – 2017-05-16 08:04:36