Вопрос

Я помогаю улучшить собственный язык, существующий уже двадцать с лишним лет, в моей компании.Это большой, тьюринг-полный язык.Переводить его в другой грамматический режим (например, 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top