Стратегии исправления ошибок при проектировании компиляторов

Опубликовано: 29 Сентября, 2022

Ошибка может возникать на разных уровнях компиляции, поэтому обработка ошибок важна для корректного выполнения кода. В основном существует пять стратегий восстановления после ошибок, а именно:

  1. Режим паники
  2. Восстановление уровня фазы
  3. Производство ошибок
  4. Глобальная коррекция
  5. Таблица символов

Режим паники:

Эта стратегия используется большинством методов синтаксического анализа. В этом методе обнаружения ошибки синтаксический анализатор отбрасывает входные символы по одному. Этот процесс продолжается до тех пор, пока не будет найден один из назначенных наборов синхронизирующих токенов. Синхронизирующие маркеры — это разделители, такие как точки с запятой или концы. Эти токены указывают на конец оператора ввода.

Таким образом, в режиме паники восстановление значительного объема входных данных проверяется на наличие дополнительных ошибок. Если в одном и том же утверждении меньше ошибок, то эта стратегия является лучшим выбором.

Пример:

C




int a, 5abcd, sum, $2;

// После int a, 5abcd , sum, $2 ; // парсер отбрасывает входные символы по одному.

Преимущество:

  1. Его легко использовать.
  2. Программа никогда не зацикливается.

Недостаток:

  1. Этот метод может привести к семантической ошибке или ошибке времени выполнения на следующих этапах.

Восстановление уровня фазы:

В этой стратегии при обнаружении ошибки синтаксический анализатор выполняет исходную коррекцию оставшихся входных данных. Он может заменить префикс оставшегося ввода некоторой строкой. Это на самом деле помогает синтаксическому анализатору продолжать свою работу. Первоначальным исправлением может быть замена запятой точкой с запятой, пропуск точки с запятой или установка отсутствующей точки с запятой. Этот тип исходной коррекции определяется разработчиком компилятора.

Примеры:

C




int a,b            
// AFTER RECOVERY:
int a,b;

Преимущества: этот метод используется во многих компиляторах, исправляющих ошибки.

Недостатки: При замене программа не должна зацикливаться.

Производство ошибок:

Это требует хорошего знания общих ошибок, с которыми можно столкнуться, тогда мы можем дополнить грамматику соответствующего языка продуктами ошибок, которые генерируют ошибочные конструкции. Если во время синтаксического анализа используется производство ошибок, мы можем сгенерировать соответствующее сообщение об ошибке, чтобы указать ошибку, которая была распознана во входных данных. Этот метод чрезвычайно отличается в обслуживании, потому что, если мы изменим грамматику, то возникает необходимость изменить соответствующие постановки.

Пример: предположим, что входная строка abcd.

Грамматика: С-> А

А-> аА | бА | и | б

Б->кд

Входная строка не может быть получена с помощью приведенной выше грамматики, поэтому нам нужно добавить расширенную грамматику.

Грамматика: E->SB // ДОПОЛНИТЬ ГРАММАТИКУ

С->А

А-> аА| бА | и | б

Б->кд

Теперь можно получить строку abcd.

Преимущества:

  1. Синтаксические фазовые ошибки обычно восстанавливаются путем производства ошибок.

Недостатки:

  1. Метод очень сложен в обслуживании, потому что если мы изменим грамматику, то потребуется изменить соответствующую продукцию.
  2. Разработчикам сложно его поддерживать.

Глобальная коррекция:

Нам часто нужен такой компилятор, который делает очень мало изменений при обработке неправильной входной строки. Учитывая неправильную входную строку x и грамматику G , сам алгоритм может найти дерево синтаксического анализа для связанной строки y; таким образом, чтобы количество вставок, удалений и изменений токена, необходимых для преобразования x в y, было как можно меньше. Методы глобальной коррекции увеличивают требования к времени и пространству во время синтаксического анализа. Это просто теоретическая концепция.

Преимущества: он вносит очень мало изменений при обработке неправильной входной строки.

Недостатки: Это просто теоретическая концепция, которую невозможно реализовать.

Таблица символов:

При семантических ошибках ошибки восстанавливаются с помощью таблицы символов для соответствующего идентификатора, и если типы данных двух операндов несовместимы, компилятор автоматически выполняет преобразование типов.

Преимущества: он позволяет выполнять базовое преобразование типов, которое мы обычно делаем в реальных вычислениях.

Недостатки: Возможно только неявное преобразование типов.