Yacc генерирует компьютерные программы, которые довольно хорошо завершены.Фреймворк yacc использует фреймворк LALR (1) для запуска действий, но действия представляют собой произвольный код.
Более того, вход в yacc - это поток токенов, а не прямой ввод.Поток токенов создается другой компьютерной программой, написанной на полном языке Тьюринга, которая также может манипулировать своим вводом способами, не ограничивающимися бесконтекстным транскодированием.
Наконец, ничто не мешает сгенерированному yacc парсеру изначальнопринятие надмножества предполагаемого языка, а затем последующий анализ неконтекстного дерева синтаксического анализа и отклонение определенных конструкций на основе произвольных вычислений, таких как настаивание на объявлении переменных перед использованием (контекстно-зависимое вычисление).
ВКороче говоря, реальные парсеры - это прагматически написанные программы, а не теоретические академические упражнения.Языки, анализируемые с помощью bison / yacc, обычно «в основном» LALR (1), и их лексический анализ обычно «в основном» регулярен, но не удивляйтесь, когда компьютерные программы используют всю свою мощь для преодоления этих ограничений.
Вот что делает программирование интересным занятием.
Ничто из этого не делает академическую теорию менее полезной.Bison / yacc и другие генераторы синтаксических анализаторов берут на себя большую часть тяжелой работы по созданию синтаксических анализаторов, потому что они могут обрабатывать «большую часть» анализа.И чем ближе язык подходит к анализируемой модели без контекста, тем легче создавать («большинство») другие полезные инструменты: линтеры, подсветки синтаксиса, переформаторы, индексаторы, статические анализаторы, экстракторы документации и т. Д. И т. Д. И т. Д.Не говоря уже о функционировании в качестве документации для синтаксиса самого языка.