Как избавиться от предупреждений в зубрах?

Я получаю много предупреждений в своем проекте. Вот одна выдержка из моего файла грамматики:

stmtlist : stmt ';'           { printf(".."); }
         | stmtlist stmt ';'  { printf(".."); }
;
  1. строка -> предупреждение: неиспользованное значение: $1
  2. строка -> предупреждение: неиспользованное значение: $2

Проблема в том, что я не хочу использовать 1 и 2 доллара. Есть ли лучшее решение, чтобы избавиться от этих предупреждений, чем называть Бизона "-Нет-другой"???

Я также получаю предупреждение, что $$ не установлен в некоторых правилах. Как я могу решить эту проблему? Должен ли я всегда устанавливать значение $$? Что делать, если у меня есть правила, которые очищают стек анализа и выполняют некоторые действия. $$ всегда помещает новое значение в стек анализа, верно?

1 ответ

Решение

Ну, наличие значений, которые вычисляются и не используются, является своего рода запахом кода. Наличие значений, которые не установлены, а затем используются, определенно является проблемой. Комбинируя их, вы получаете значение, которое иногда устанавливается, а иногда и неинициализируется, а затем иногда используется, что является просто случайностью, ожидающей, если не явной ошибкой.

Так что вам нужно выяснить, почему у вас есть эти неиспользованные и неинициализированные вещи? В вашем примере похоже, что вы объявили %type за stmt, но вы не используете значение в этих правилах. Если вы никогда не используете значение из stmtто, что нужно сделать, это избавиться от %type для него - таким образом, он не имеет значения, поэтому bison не предупредит вас о том, что вы не используете несуществующее значение.

В случае настройки $$ - бизон толкает значение в $$ на стек анализа значений, когда это уменьшает правило. Так что если вы не установите $$, это означает, что это выталкивает мусор. Теперь, если вы тогда игнорируете этот мусор (как с вашим stmt правила выше), то все в порядке, но если вы используете значение, это может быть проблемой.

Так что это может быть случай, когда вы можете исправить свои предупреждения, просто удалив %type объявление, которое вам не нужно - если вы делаете объявление типа значения для некоторого нетерминала, но затем не устанавливаете значение (вызывает предупреждение) и не используете значение (вызывает другое предупреждение).

Другие вопросы по тегам