如何解决警告:规则在语法中无用Bison / Yacc
我一直在努力解决与当前学校作业有关的问题,如果有人能向我解释为什么我从编译器(例如decafast.y:201.13-16: warning: rule useless in grammar [-Wother] | Type.
)收到警告,我将不胜感激。
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()方法,这就是为什么如果看到一个T_ID,我尝试使用诸如(对于ident_list,第94行)之类的方法,然后创建列出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
。我认为您在其他列表产品中也犯了同样的错误。)
野牛规则的语法为: 结果:组件...;
据我所见,您的规则都没有分号。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。