簡體   English   中英

警告:規則在語法中無用 (Bison/Yacc)

[英]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.

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