[英]Warning: rule useless in grammar (Bison/Yacc)
我一直在嘗試解決與當前學校作業相關的這個問題,如果有人能向我解釋為什么我會收到來自編譯器的警告,例如decafast.y:201.13-16: warning: rule useless in grammar [-Wother] | Type.
decafast.y:201.13-16: warning: rule useless in grammar [-Wother] | Type.
我在以下兩個 pastebin 文件中提供了我的代碼:
decafast.lex: https://pastebin.com/2qzG2cwW
decafast.y: https://pastebin.com/Akg5ehW1
我還收到了一個文件“decafast.cc”,其中包含使我能夠創建列表的類和方法(我相信這就是目的),可在以下位置找到:
https://pastebin.com/M7XRJunL
以及我應該遵循的規范(在頁面底部找到語法):
http://anoopsarkar.github.io/compilers-class/decafspec.html
我主要擔心的是為什么我似乎收到這些警告(我認為是)導致我的代碼失敗。 幾乎所有(如果不是全部)我的語法都被認為是無用的,盡管我在網上搜索(或缺乏理解已經說過的內容),但我仍然沒有成功。
如果有人能夠啟發我,我還有一個次要問題。 關於上面的 .cc 文件,我得到了一些實現 decafAST 類的類。 在我的解析器生成器文件 (decafast.y) 中,我嘗試通過執行以下操作來創建列表
decafStmtList *s = new decafStmtList();
我假設這將允許我使用 push_back() 和 push_front() 方法,這就是為什么我嘗試諸如(在 ident_list 的情況下,第 94 行)如果我看到一個 T_ID,然后我為 T_ID 創建列表(標識符)並將當前 T_ID 推送到列表中。 如果我看到 ident_list T_COMMA T_ID 的情況(這是我假設的逗號分隔標識符的重復列表的情況),那么我會將其識別為 ident_list 模式,從而將該 T_ID 也推送到列表中. 這是使用我提供的列表的正確方法嗎?
我想強調的是,由於這是一個作業問題,我懇請您提供任何幫助,使我能夠按照自己的方式學習。 我確信本網站上的用戶可以輕松解決此任務,因此我非常感謝您在不給我明確答案的情況下提供的任何見解。 謝謝大家的時間!
為您提供的語法開頭為:
Program = Externs package identifier "{" FieldDecls MethodDecls "}" .
也就是說,一個程序包括:
語法的其余部分定義了字段和方法聲明的樣子,盡管有幾個產生式定義了外部聲明。
但是你的語法完全不同:(我刪除了動作,因為它們與語法無關)
start: program
program: extern_list decafpackage
extern_list:
| ExternDefn
decafpackage: T_PACKAGE T_ID T_LCB T_RCB
您的decafpackage
僅包含package ID { }
,大括號之間沒有任何內容。
因此,其余的大部分語法產生式(詳細說明字段和方法聲明)永遠無法使用,從而使它們無用。
(此外,您的extern_list
沒有定義ExternDecl
列表。它定義了一個可選的ExternDecl
。我認為您在其他列表制作中犯了同樣的錯誤。)
野牛規則的語法是: result: components...;
據我所知,你的規則都沒有分號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.