Некоторые подходы, которые используются для восстановления кода после ошибок во фронтенде компилятора:
- Добавление правил, порождающих ошибки. 1 Например, лексер может считать ошибочной подстроку, в которой целое число склеено с идентификатором без пробелов и разделителей. 1 Парсер может обрабатывать специальным правилом появление else без if. 1
- Пропуск ввода и восстановление по специальным символам и токенам. 1 Например, если лексер не может найти закрывающую кавычку в строковом литераторе, он должен продвигаться не дальше конца текущей строки. 1 Если конец строки достигнут, а кавычки нет, лексер сможет сообщить об ошибке и двигаться дальше. 1
- Режим паники. 2 При обнаружении ошибки анализатор отбрасывает входные символы по одному за раз. 2 Этот процесс продолжается до тех пор, пока не будет найден один из назначенных наборов синхронизирующих маркеров. 2 Синхронизирующие маркеры — разделители, такие как точки с запятой или окончания, которые указывают на конец инструкции ввода. 2
- Восстановление уровня фразы. 2 В этой стратегии при обнаружении ошибки анализатор выполняет локальное исправление оставшихся входных данных. 2 Он может заменить префикс оставшихся входных данных некоторой строкой, что помогает анализатору продолжить свою работу. 2
- Использование таблицы символов. 2 При семантических ошибках ошибки восстанавливаются с помощью таблицы символов для соответствующего идентификатора. 2 Если типы данных двух операндов несовместимы, компилятор выполняет автоматическое преобразование типов. 2