Есть ли там грамматические отладчики 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 строк "вещи", которые просто отлично.
Ответ 2
Это лучшее, что я получил:
http://tldp.org/HOWTO/Lex-YACC-HOWTO-7.html