2013-07-30 3 views
0

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

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

Проблема заключается в том, что я не хотят использовать $ 1 и $ 2. Есть ли лучшее решение, чтобы избавиться от этих предупреждений, чем назвать Bison «-Wno-other» ???

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

ответ

1

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

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

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

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

+0

* facepalm * Я определил тип% для нетерминального символа, который я не использую. Удалив это, удаляет предупреждение ... Спасибо Крису !!! – user4811

Смежные вопросы