отладка yacc YYDEBUG где y.debug

#debugging #yacc

#отладка #yacc

Вопрос:

Я пытаюсь отладить компонент, созданный yacc для awk (awk.g.c), но когда я определяю YYDEBUG, он включает y.debug, которого у меня, похоже, нет.

Откуда берется y.debug?

Без него есть несколько ссылок, которые не определены.

Я компилирую старую версию awk 32v или V7, поэтому я не уверен, что это то, что все еще существует.

Ответ №1:

Некоторые версии yacc (в частности, версия AT amp; T, все еще доступная как часть плана 9) сгенерировали дополнительный файл с суффиксом .debug , содержащий отладочную информацию, в частности таблицу, которая преобразовывала номера символов обратно в имена. Современные yacc-аналоги просто вставляют эту информацию в сгенерированный файл C на том основании, что потребление памяти в наши дни в основном тривиально.

Таблица имен может не быть сгенерирована, если вы ее не запрашиваете, но способ ее запроса зависит от версии yacc:

  1. Большинство версий bison генерируют таблицу только в том случае, если включена опция трассировки. ( -t Для этого требуется Posix, но bison предоставляет множество альтернатив, и не все исторические yacc соблюдены.)
  2. Как указано выше, некоторые действительно старые yacc помещают таблицу имен в y.debug . Реализация AT amp; T, как я упоминал выше, всегда делала это, но защищала #include строку с условием препроцессора на YY_DEBUG
  3. Однако реализация yacc, на которую вы указали в комментарии, которая использует y.debug механизм с условным включением, генерирует y.debug файл только в том случае, если вы вызываете его с -D помощью флага. Итак, это то, что вам нужно сделать.

Примечания

Я обнаружил информацию в пункте 3 из источника версии 10, на который ссылается комментарий. Ссылка на скачивание находится вверху этой страницы; это не было сразу очевидно из ссылки в комментарии. (Это полный архив с исходным кодом, который составляет около 70 МБ. Отдельные файлы, на которые ссылается ссылка в комментарии, были HTMLized, что затрудняет их работу.) Я мог бы сэкономить некоторое время, прочитав примечания к выпуску (вызывается yaccnews , а не CHANGES ). Последнее примечание в этом файле описывает реализацию, и я включаю этот абзац здесь, поскольку в нем есть все подробности о том, как работает отладка в этой конкретной версии yacc.

8/11/81 Изменена отладка. Если анализатор запускается с %{#define YYDEBUG %} и yacc вызывается как yacc -D (для отладки), то анализатор использует внешнюю переменную с именем yydebug для управления выводом отладки. Если yydebug == 1 синтаксический анализатор распечатывает текст сокращения при его выполнении. Если yydebug == 2 анализатор также выводит имя токена, возвращаемого каждым вызовом yylex , и если yydebug == 3 анализатор также выводит активные элементы каждый раз, когда он меняет состояние (это неинтересно).

Как бы то ни было, должна быть возможность сгенерировать рабочий, компилируемый синтаксический анализатор с использованием современного yacc (например, bison или byacc). В долгосрочной перспективе это, вероятно, будет проще. (Если вы используете bison и вам требуется совместимость с устаревшим yacc, вы можете использовать -y флаг. Этот флаг не поддерживается byacc, который утверждает, что он совместим с устаревшими, независимо от этого.)

Комментарии:

1. Я подумал, что то, что вы сказали, заслуживает внимания. Однако я (повторно) генерирую awk.g.c из awk.g.y в каждом случае. Итак, я просмотрел версию yacc 32V / V7 (которую я использую), но не смог найти никаких ссылок на создание этого файла. Существует всего несколько параметров командной строки yacc, и ни один из них не подходит для отладки.

2. @WallyZ: я не знаю, какой yacc вы используете, но если вы укажете, где я могу увидеть его исходный код, я посмотрю на него.

3. Мой источник отсюда: minnie.tuhs.org/cgi-bin/utree.pl?file=V10/cmd/yacc

4. Глядя в этот источник, yacc содержит условный #include для «y.debug» и поэтому, похоже, нуждается в нем, а не генерирует его. Может ли awk сгенерировать его?

5. y.debug Файл явно сгенерирован этим yacc (зависит от флага командной строки). Файл открывается (условно , Dflag т.Е. -D ) в y2.c: 946; отладочная информация записывается в него в defout функции в том же файле в строке 472. Условное включение, которое вы видели, я думаю, находится в шаблоне синтаксического анализатора yacc, yaccpar , который не является частью исполняемого файла yacc. Я обновил свой ответ.