Есть ли отладчики грамматики Yacc? - PullRequest
11 голосов
/ 29 октября 2009

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

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

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

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

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

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

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

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

Ответы [ 2 ]

7 голосов
/ 29 октября 2009

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

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

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

2 голосов
/ 29 октября 2009

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

...