#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:
- Большинство версий bison генерируют таблицу только в том случае, если включена опция трассировки. (
-t
Для этого требуется Posix, но bison предоставляет множество альтернатив, и не все исторические yacc соблюдены.) - Как указано выше, некоторые действительно старые yacc помещают таблицу имен в
y.debug
. Реализация AT amp; T, как я упоминал выше, всегда делала это, но защищала#include
строку с условием препроцессора наYY_DEBUG
- Однако реализация 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. Я обновил свой ответ.