1

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

stmtlist : stmt ';'           { printf(".."); }
         | stmtlist stmt ';'  { printf(".."); }
;
  1. 行 -> 警告:未使用的值:$1
  2. 行 -> 警告:未使用的值:$2

问题是我不想使用 $1 和 $2。有没有比用“-Wno-other”调用 Bison 更好的解决方案来摆脱这些警告?

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

4

1 回答 1

2

好吧,具有计算但未使用的值是一种代码气味。具有未设置然后使用的值绝对是一个问题。将两者结合起来,您会得到有时设置、有时未初始化、有时使用的值,如果不是彻底的错误,这只是等待发生的意外。

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

在设置的情况下$$——bison 在$$减少规则时将值推入解析值堆栈。因此,如果您不设置$$,则意味着它会推送垃圾。现在,如果您随后忽略该垃圾(如stmt上面的规则),那么没关系,但是如果您使用该值,则可能会出现问题。

%type因此,您可能只需删除不需要的声明即可修复警告- 如果您正在做的是为某些非终端声明值类型,但随后不设置值(导致警告)并且不使用该值(导致另一个警告)。

于 2013-07-30T21:37:46.017 回答