1

プロジェクトで多くの警告が表示されます。以下は、私の文法ファイルの抜粋です。

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

問題は、$1 と $2 を使いたくないということです。「-Wno-other」で Bison を呼び出すよりも、これらの警告を取り除くためのより良い解決策はありますか???

また、一部のルールで $$ が設定されていないという警告も表示されます。この問題を解決するにはどうすればよいですか? 常に $$ を値に設定する必要がありますか? 解析スタックをクリーンアップし、いくつかのアクションを実行するルールがあるとしたらどうでしょう。$$ は常に解析スタックに新しい値を置きますよね?

4

1 に答える 1

2

まあ、計算されて使用されていない値を持つことは、一種のコード臭です。値を設定せずに使用することは、間違いなく問題です。2 つを組み合わせると、値が設定されたり、初期化されなかったり、使用されたりする値が得られます。これは、完全なバグではないにしても、起こるのを待っている単なる事故です。

では、これらの未使用および初期化されていないものがなぜあるのかを理解する必要があります。あなたの例では、%typeforを宣言したように見えstmtますが、これらのルールで値を使用していません。の値をまったく使用しない場合は、 forstmtを削除するのが正しい方法です。これにより、値%typeがなくなるため、bison は存在しない値を使用しないことについて警告しなくなります。

--を設定した場合、$$bison$$はルールを縮小するときに値を解析値スタックにプッシュします。したがって、設定しない場合$$、それはゴミをプッシュすることを意味します。次に、そのガベージを(stmt上記のルールと同様に)無視すると問題ありませんが、値を使用すると問題になる可能性があります。

そのため、必要のない宣言を削除するだけで警告を修正できる場合が%typeあります。非端末の値の型を宣言しているが、値を設定していない場合 (値を使用しない (別の警告が発生する)。

于 2013-07-30T21:37:46.017 に答える