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


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

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

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

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

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

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

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

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


11


источник


Ответы:


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

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

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


7



Это лучшее, что я получил: http://tldp.org/HOWTO/Lex-YACC-HOWTO-7.html


2