Есть ли там грамматические отладчики Yacc?

Я помогаю расширить свой собственный фирменный язык в моей компании на двадцать один год. Это большой, полный язык Тьюринга. Перевод его в другой режим грамматики (например, Antlr) не является вариантом (я не могу это решить).

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

  • трудно устранить
  • иногда просто не имеет смысла (для моего слабого мозга)

После многих мучительных взглядов на файлы y.output и экспериментальных рефакторингов грамматики я обычно получал туда, куда хотел. Иногда мне приходилось делать неудовлетворительные компромиссы.

Итак, есть ли какие-либо инструменты, которые могут всасывать грамматику yacc, которые улучшают просмотр, экспериментируют и позволяют отлаживать изменения?

Если я добавлю производство, я бы хотел увидеть больше, чем "атомарное производство, которое используется везде" (думаю, идентификатор) "конфликтует с правилом foo" (да, есть больше информации, s/r, r/r, чем это, но я думаю, что вы получите мой дрейф). Было бы неплохо иметь некоторый намек на взаимодействие, не полагаясь на мою мыслящую шапку и пытаясь представить себе стек символов и машину состояний.

Обновление: Думаю, я должен уточнить. Мы используем Berkeley Yacc. Я тестировал, используя недавнюю версию Bison. Для вывода я скомпилировал грамматику с параметром -report = itemset.

Моя цель с этой должности - искать внешние инструменты, которые дополняют средства отладки грамматики, которые отправляются с yacc. Сегодня это больно с набором по умолчанию. Помогите мне найти лучшие интерактивные инструменты, например те, которые вы можете использовать с Antlr.

Ответ 1

Вы можете получить некоторую помощь от yacc -d, которая выводит вывод отладки - она ​​в основном дает полный список состояний стека символов и т.д. Выход плотный и объемный, поэтому попытка прочитать все это прямо редко делает много (никогда не для меня, так или иначе). Однако, когда вы вносите изменения, вы получаете (например) конфликт r/r, вы можете запустить yacc -d на старой грамматике и новой, затем запустить diff для результатов, чтобы получить более подробный прогон о том, какие изменения вызвали конфликт.

Однако, вероятно, стоит отметить, что конфликты s/r часто бывают доброкачественными - если вы не уверены, что это проблема, попытка "исправить" часто не стоит. То же самое происходит и с r/r-конфликтами. Хотя они иногда являются доброкачественными, это сравнительно редко.

Изменить: Oops - извините, это должно быть -v. Вы указываете y.output, поэтому вы, очевидно, уже знаете, как сделать эту часть. Дело в том, что вы не пытаетесь напрямую смотреть на файлы y.output, но делаете разницу между тем, который вышел чисто, и тот, который не получал детали о реальном конфликте (не глядя на 10 jillion строк "вещи", которые просто отлично.