Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпорки.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
352.68 Кб
Скачать
  1. Обработка ошибок при нисходящем разборе.Обнаружение и нейтрализация ошибок.

Неправильная цепочка – синтаксически неверная входная цепочка.

Любой компилятор обязан обнаруживать ошибки.

Задачи:

  1. Обнаружение ошибки

Рассмотрим обработку ошибок при использовании магазинного автомата.

Входная цепочка: aabca. Указатель стоит на «с».

Выходим на ошибку тогда, когда в ячейке ошибки получаем «отвергнуть». За «отвергнуть» должна скрываться процедура PE (proceeding error) обработки ошибки.

Выбор(<S>)={ }=L – множество выбора; c L <S> является ошибкой. Но мы знаем, что находится во множестве выбора.

Ошибка: «Ожидалось множество_выбора, но вместо встретилось с»

Если указатель на конец цепочки, то ошибка: “<S>-выражение не завершено”

c стоит там, где ожидалось <S>-выражение

Пример:

  • <S> a

  • <S> (<S><R>

  • <R> ,<S><R>

  • <R> )

Это S-грамматика.

Пример корректной цепочки: (a,a,(a,a))

Множество входных символов: a ( , )

a

(

,

)

<S>

#1

#2

отвергнуть a

отвергнуть b

отвергнуть c

<R>

отвергнуть d

отвергнуть e

#3

#4

отвергнуть f

отвергнуть g

отвергнуть h

отвергнуть i

отвергнуть j

допустить

#1: Вытолкнуть, Сдвиг

#2: Заменить (<R><S>), Сдвиг

#3: Заменить (<R><S>), Сдвиг

#4: Вытолкнуть, Сдвиг

  1. Описание ошибки

Pa: Запятая стоит там, где ожидалось “a” или открывающая скобка

Pb: Закрывающая скобка стоит там, где ожидалось “a” или открывающая скобка

Pс: <S>-выражение не закончено: возможно пропущено “a”

Pd: “a” стоит там, где ожидалась запятая или закрывающая скобка

Pe: Открывающая скобка стоит там, где ожидалась запятая или закрывающая скобка

Pf: <R>-выражение не закончено: возможно пропущена закрывающая скобка

Pg: “a” встретилось после окончания <S>-правила (группа выражений)

Ph: Открывающая скобка встретилась после окончания <S>-правила

Pi: Запятая встретилась после окончания <S>-правила

Pj: Возможно неправильно поставлены скобки

  1. Нейтрализация ошибки – процесс изменения конфигурации синтаксического анализатора: на основе полученной ошибки, мы изменяем ход синтаксического разбора так, чтобы это могло привести к какому-то результату. Например, попробовать подставить точку с запятой при ее пропуске.

    • Глобальная нейтрализация

Главная цель: когда во входной цепочке встретилась ошибка, а синтаксический анализ необходимо продолжать, то во входной цепочке делается переход. Этот переход продолжается до тех пор, пока не будет найден входной символ из множества «надежных». И нейтрализация будет зависеть от этого входного символа и верхнего магазинного символа.

«Надежные» символы бывают двух классов:

  • Синхронизирующие символы – символы, относительно которых можно с высокой степенью вероятности возобновить процесс синтаксического анализа. К таким классам в Паскале, например, относят: “end.”, “;”, “)”, “then”.

  • Начинающие символы

  • Локальная нейтрализация

1. Генерация сообщения об ошибке

2. Втолкнуть ({ошибка})

3. Втолкнуть (<S>)

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

  • Локальная нейтрализация

Эвристика – способ отсеивания заведомо неверных путей. Применяется для сокращения времени выполнения.

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

После выдачи сообщений Pa и Pb: Вытолкнуть, Держать

После выдачи сообщений Pd и Pe: Заменить(<R><S>), Держать

После выдачи сообщений Pc и Pf: Вытолкнуть, Выход

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]