Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
бАКАЛАВР_РАБОТА.docx
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
2.13 Mб
Скачать

4.2.4 Восстановление после ошибок

Ошибка в процессе предиктивного синтаксического анализа обнаруживается в тот момент, когда терминал на вершине стека не соответствует очередному входному символу или когда на вершине стека находится нетерминал A, очередной входной символ – a, а ячейка синтаксического анализа M[A,a] содержит error(т.е. данная запись таблицы пуста).

Простейшим способом восстановления после ошибок является восстановление “в режиме паники”. Этот способ основан на пропуске символов из входного потока до тех пор, пока не будет обнаружен токен из предопределённого множества синхронизирующих токенов.Запись synв таблице синтаксического анализа указывает такой токен.Эффективность этого метода зависит от выбора синхронизирующего множества. Эти множества выбираются так, чтобы синтаксический анализатор быстро восстанавливался после часто встречающихся на практике ошибок.Далее приведены эвристики, используемые при реализации этого метода:

  1. В качестве первого приближения в синхронизирующее множество для нетерминала A помещаются все символы из множества FOLLOW(A).Если пропустить все токены до элементов изFOLLOW(A) и снять A со стека, вероятно, удастся продолжить синтаксический анализ;

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

  3. Если добавить символы из FIRST(A) в синхронизирующее множество для нетерминалов, станет возможным продолжение анализа в соответствии с A, когда во входном потоке появится символы из FIRST(A);

  4. Если нетерминал может порождать пустую строку, то в качестве продукции по умолчанию может использоваться продукция, порождающая ε;

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

Таблица синтаксического анализа, дополненнаясинхронизирующими записями, используется следующим образом. Если синтаксический анализатор просматривает ячейку M[A,a]и обнаруживает, что она пуста, то входной символ aпропускается. Если в этой ячейке находится запись syn, то нетерминал снимается со стека в попытке продолжить синтаксический анализ. Если токен на вершинестека не соответствует входному символу, то, как упоминалось выше,он снимается со стека. Очевидно из выше сказанного, что такой способ восстановления не перестраивает синтаксическое дерево, т.е. все действия производятся только над символами, находящимися после места возникновения ошибки. Такие стратегии восстановления после ошибки относят к локальным.

Восстановление “в режиме паники” наиболее эффективнов таких случаях, когда несколько ошибок в одном операторе встречаются редко. На самом деле, этопочти всегда так. По статистике 80% неверных операторов имеют только одну ошибку, 13% - две [8].