Книга Дракона («Компиляторы: принципы, методы и инструменты» Ахо, Сетхи и Уллмана) описывает несколько методов, которые авторы компиляторов могут использовать для улучшения обнаружения ошибок и создания отчетов при вводе данных.файлы, которые не соответствуют спецификации языка.
Некоторые из методов, которые они дают:
Восстановление в режиме паники: пропускайте все входные токены во входном потоке, пока вы ненашли «синхронизирующий токен» - например, операторы ;
, }
или end
и терминаторы или разделители блоков, или do
, while
, for
, function
и т. д.которые могут показать предполагаемые запуски новых блоков кода и т. д. Надеемся, что ввод с этой точки будет иметь смысл для анализа и возврата полезных сообщений об ошибках.
Восстановление уровня фразы: угадайте, чтофраза может означать: вставлять точки с запятой, заменять запятые на точки с запятой, вставлять =
операторы присваивания и т. д., и надеяться, что результат имеет достаточный смысл для парсингаe и возвращает полезные сообщения об ошибках.
Произведения ошибок: в дополнение к "законным" производствам, которые распознают допустимые операторы грамматики, есть "производства ошибок", которые распознают ошибки на языке, будет против грамматики, но что авторы компилятора признают очень вероятные ошибки.Сообщения об ошибках для них могут быть очень хорошими, но могут резко увеличить размер анализатора для оптимизации ошибок ввода (что должно быть исключением, а не общим случаем).
Глобальное исправление: попытайтесь внести минимальные изменения во входную строку, чтобы попытаться вернуть ее в программу, которую можно проанализировать.Так как исправления могут быть внесены различными способами (вставка, изменение и удаление любого количества символов), попробуйте сгенерировать их все и обнаружить изменение «наименьшей стоимости», которое делает программу достаточно хорошо анализируемой для продолжения анализа.
Эти параметры представлены в главе о разборе грамматики (стр. 161 в моем издании) - очевидно, некоторые ошибки обнаруживаются только после того, как входной файл был проанализирован, но начинает преобразовываться восновные блоки для оптимизации и генерации кода.Любые ошибки, возникающие на более ранних синтаксических уровнях, не позволят типичному компилятору запускать фазы оптимизации и генерации кода, и любые ошибки, которые могут быть обнаружены на этих этапах, должны ждать фиксированного ввода, прежде чем они смогут быть запущены.
Я настоятельно рекомендую найти копию Книги Дракона, она даст вам некоторое сочувствие и, надеюсь, вновь обретенное уважение к нашим дружелюбным авторам компиляторов.