Bison 如何摆脱野牛的警告?

Bison 如何摆脱野牛的警告?,bison,yacc,Bison,Yacc,我在我的项目中得到了很多警告。以下是我语法文件的一个摘录: stmtlist : stmt ';' { printf(".."); } | stmtlist stmt ';' { printf(".."); } ; 行->警告:未使用的值:$1 行->警告:未使用的值:$2 问题是我不想使用1美元和2美元。有没有比用“-Wno other”称呼野牛更好的方法来消除这些警告 我还收到警告,在某些规则中未设置$$。我如何解决这个问题?我是否应该始终将$$设置

我在我的项目中得到了很多警告。以下是我语法文件的一个摘录:

stmtlist : stmt ';'           { printf(".."); }
         | stmtlist stmt ';'  { printf(".."); }
;
  • 行->警告:未使用的值:$1
  • 行->警告:未使用的值:$2
  • 问题是我不想使用1美元和2美元。有没有比用“-Wno other”称呼野牛更好的方法来消除这些警告


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

    好吧,有计算的值而不使用是一种代码味道。拥有未设置然后使用的值肯定是一个问题。将二者结合起来,您可以得到有时设置、有时未初始化、有时使用的值,这只是一个等待发生的意外,如果不是一个彻底的错误的话

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

    在设置
    $
    的情况下--bison在减少规则时将
    $$
    中的值推送到解析值堆栈上。因此,如果不设置
    $$
    ,这意味着它会推送垃圾。现在,如果忽略该垃圾(与上面的
    stmt
    规则一样),则可以,但如果使用该值,则可能会出现问题

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

    facepalm我为我不使用的非终端符号定义了一个%类型。删除此,将删除警告。。。谢谢克里斯!!!