警告:规则在语法中无用Bison / Yacc

问题描述

我一直在努力解决与当前学校作业有关的问题,如果有人能向我解释为什么我从编译器(例如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()方法,这就是为什么如果看到一个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。我认为您在其他列表产品中也犯了同样的错误。)

,

野牛规则的语法为: 结果:组件...;

据我所见,您的规则都没有分号。