【发布时间】:2020-10-17 06:04:54
【问题描述】:
我一直在尝试解决与当前学校作业相关的这个问题,如果有人能向我解释为什么我会收到来自我的编译器的警告,例如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 也推送到列表中.这是使用我提供的列表的正确方法吗?
我想强调的是,由于这是一道作业题,我恳请您提供任何帮助,让我能够按照自己的方式学习。我确信本网站上的用户能够轻松解决此任务,因此我非常感谢您在不给我明确答案的情况下提供的任何见解。谢谢大家的时间!
【问题讨论】:
-
将 -v 标志添加到 yacc。它将生成更详细的错误解释:heirloom.sourceforge.net/devtools/yacc.1.html