Существуют ли отладчики грамматики Yacc?
-
08-07-2019 - |
Вопрос
Я помогаю улучшить собственный язык, существующий уже двадцать с лишним лет, в моей компании.Это большой, тьюринг-полный язык.Переводить его в другой грамматический режим (например, Antlr) не вариант (не мне это решать).
По большей части расширение грамматики прошло гладко.Но время от времени я получаю сокращение-уменьшение или сдвиг-уменьшение,
- трудно устранить
- иногда просто не имеет смысла (для моего слабого мозга)
После долгих болезненных разглядываний y.выход файлов и экспериментального рефакторинга грамматики, я обычно добивался того, чего хотел.Иногда мне приходилось идти на неудовлетворительные компромиссы.
Итак, существуют ли какие-либо инструменты, которые могут использовать грамматику yacc, которые улучшают просмотр, экспериментирование и позволяют отлаживать изменения?
Если я добавлю производство, я бы хотел видеть нечто большее, чем просто «атомное производство, которое используется повсюду» (подумайте об идентификаторе), «конфликтующее с правилом foo» (да, здесь больше информации, с/р, р/р, чем эта , но я думаю, вы меня поняли).Было бы неплохо получить хоть какой-то намек на это взаимодействие, помимо того, что я надел мыслительную шапку и попытался представить стек символов и конечный автомат.
Обновлять:Думаю, мне следует уточнить.Мы используем Беркли Yacc.Я тестировал последнюю версию Bison.Для вывода я скомпилировал грамматику с помощью --report=набор элементов.
Моя цель в этом посте — найти внешний инструменты, которые увеличить средства отладки грамматики, поставляемые с yacc.Мучительно сегодня с дефолтным набором.Помогите мне найти более эффективные интерактивные инструменты, например те, которые можно использовать с Antlr.
Решение
Ты мощь получить помощь от yacc -d
, который выдает отладочную информацию — по сути, он дает полный список состояний стека символов и тому подобное.Вывод плотный и объемный, поэтому попытка прочитать все напрямую редко дает много результатов (по крайней мере, для меня никогда).Однако, когда вы вносите изменение, которое приводит (например) к конфликту r/r, вы можете запустить yacc -d
на старой и новой грамматике, а затем запустите diff результатов, чтобы получить более подробную информацию о том, какие изменения вызвали конфликт.
Однако, вероятно, стоит отметить, что конфликты s/r часто безобидны - если вы не уверены, что это проблема, попытки «исправить» ее часто не имеют смысла.Однако этого нельзя сказать о конфликтах r/r.Пока это иногда доброкачественный, встречается сравнительно редко.
Редактировать:К сожалению, извините, это должно быть -v.Вы упомянули y.output, так что, очевидно, вы уже знаете, как это сделать.Дело в том, что вы не пытаетесь просмотреть файлы y.output напрямую, а делаете разницу между тем, который вышел чисто, и тем, который не получился, чтобы получить некоторые подробности о реальном конфликте (не глядя на 10 миллиарды строк «вещей», это просто нормально.
Другие советы
Это лучшее, что у меня есть:http://tldp.org/HOWTO/Lex-YACC-HOWTO-7.html