关于yacc:如何摆脱Bison中的警告?

How to get rid of warnings in Bison?

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

1
2
3
stmtlist : stmt ';'           { printf(".."); }
         | stmtlist stmt ';'  { printf(".."); }
;
  • 行 -> 警告:未使用的值:$1
  • 行 -> 警告:未使用的值:$2
  • 问题是我不想使用 $1 和 $2。有没有比使用"-Wno-other"调用 Bison 更好的解决方案来消除这些警告???

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


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

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

    在设置$$的情况下——bison在减少规则时将$$中的值压入解析值栈。所以如果你不设置$$,那意味着它会推送垃圾。现在,如果您随后忽略该垃圾(与上面的 stmt 规则一样),则可以,但是如果您使用该值,则可能会出现问题。

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