我的项目中收到了很多警告。这是我的语法文件的一个摘录:
stmtlist : stmt ';' { printf(".."); }
| stmtlist stmt ';' { printf(".."); }
;
问题在于我不想使用$ 1和$ 2。是否有更好的解决方案来摆脱这些警告,而不是用“-Wno-other”调用Bison ???
我还得到警告,在某些规则中没有设置$$。我该如何解决这个问题?我应该总是将$$设置为一个值吗?如果我有清理解析堆栈并执行某些操作的规则,该怎么办? $$总是在解析堆栈上放一个新值,对吗?
答案 0 :(得分:1)
好吧,拥有计算和未使用的值是一种代码味道。拥有未设置然后使用的值肯定是一个问题。结合这两者,你得到的价值有时会被设定,有时会被初始化,有时会被使用,如果不是一个彻头彻尾的错误,这只是偶然发生的事故。
所以你需要弄清楚为什么你有这些未使用和未初始化的东西吗?在您的示例中,您似乎已为%type
声明stmt
,但您未使用这些规则中的值。如果你从不使用stmt
中的值,那么正确的做法就是摆脱它%type
- 这样它没有价值,所以野牛不会警告你不要使用不存在的价值。
在设置$$
的情况下 - bison在减少规则时将$$
中的值推送到解析值堆栈。所以,如果你没有设置$$
,那就意味着它会推动垃圾。现在,如果你忽略了那个垃圾(就像你上面的stmt
规则一样),那么没关系,但是如果你使用这个值可能会有问题。
因此,您可以通过删除不需要的%type
声明来修复警告 - 如果您正在做的是为某些非终端声明值类型,但是然后没有设置值(导致警告)而不使用该值(导致另一个警告)。