如何摆脱野牛的警告?

时间:2013-07-30 18:07:20

标签: bison yacc

我的项目中收到了很多警告。这是我的语法文件的一个摘录:

stmtlist : stmt ';'           { printf(".."); }
         | stmtlist stmt ';'  { printf(".."); }
;
  1. line - >警告:未使用的值:$ 1
  2. line - >警告:未使用的值:$ 2
  3. 问题在于我不想使用$ 1和$ 2。是否有更好的解决方案来摆脱这些警告,而不是用“-Wno-other”调用Bison ???

    我还得到警告,在某些规则中没有设置$$。我该如何解决这个问题?我应该总是将$$设置为一个值吗?如果我有清理解析堆栈并执行某些操作的规则,该怎么办? $$总是在解析堆栈上放一个新值,对吗?

1 个答案:

答案 0 :(得分:1)

好吧,拥有计算和未使用的值是一种代码味道。拥有未设置然后使用的值肯定是一个问题。结合这两者,你得到的价值有时会被设定,有时会被初始化,有时会被使用,如果不是一个彻头彻尾的错误,这只是偶然发生的事故。

所以你需要弄清楚为什么你有这些未使用和未初始化的东西吗?在您的示例中,您似乎已为%type声明stmt,但您未使用这些规则中的值。如果你从不使用stmt中的值,那么正确的做法就是摆脱它%type - 这样它没有价值,所以野牛不会警告你不要使用不存在的价值。

在设置$$的情况下 - bison在减少规则时将$$中的值推送到解析值堆栈。所以,如果你没有设置$$,那就意味着它会推动垃圾。现在,如果你忽略了那个垃圾(就像你上面的stmt规则一样),那么没关系,但是如果你使用这个值可能会有问题。

因此,您可以通过删除不需要的%type声明来修复警告 - 如果您正在做的是为某些非终端声明值类型,但是然后没有设置值(导致警告)而不使用该值(导致另一个警告)。