Как избавиться от предупреждений в зубрах?
Я получаю много предупреждений в своем проекте. Вот одна выдержка из моего файла грамматики:
stmtlist : stmt ';' { printf(".."); }
| stmtlist stmt ';' { printf(".."); }
;
- строка -> предупреждение: неиспользованное значение: $1
- строка -> предупреждение: неиспользованное значение: $2
Проблема в том, что я не хочу использовать 1 и 2 доллара. Есть ли лучшее решение, чтобы избавиться от этих предупреждений, чем называть Бизона "-Нет-другой"???
Я также получаю предупреждение, что $$ не установлен в некоторых правилах. Как я могу решить эту проблему? Должен ли я всегда устанавливать значение $$? Что делать, если у меня есть правила, которые очищают стек анализа и выполняют некоторые действия. $$ всегда помещает новое значение в стек анализа, верно?
1 ответ
Ну, наличие значений, которые вычисляются и не используются, является своего рода запахом кода. Наличие значений, которые не установлены, а затем используются, определенно является проблемой. Комбинируя их, вы получаете значение, которое иногда устанавливается, а иногда и неинициализируется, а затем иногда используется, что является просто случайностью, ожидающей, если не явной ошибкой.
Так что вам нужно выяснить, почему у вас есть эти неиспользованные и неинициализированные вещи? В вашем примере похоже, что вы объявили %type
за stmt
, но вы не используете значение в этих правилах. Если вы никогда не используете значение из stmt
то, что нужно сделать, это избавиться от %type
для него - таким образом, он не имеет значения, поэтому bison не предупредит вас о том, что вы не используете несуществующее значение.
В случае настройки $$
- бизон толкает значение в $$
на стек анализа значений, когда это уменьшает правило. Так что если вы не установите $$
, это означает, что это выталкивает мусор. Теперь, если вы тогда игнорируете этот мусор (как с вашим stmt
правила выше), то все в порядке, но если вы используете значение, это может быть проблемой.
Так что это может быть случай, когда вы можете исправить свои предупреждения, просто удалив %type
объявление, которое вам не нужно - если вы делаете объявление типа значения для некоторого нетерминала, но затем не устанавливаете значение (вызывает предупреждение) и не используете значение (вызывает другое предупреждение).