
- •Упрощенная модель компилятора. Проходы компилятора.
- •3. Проходы компиляторов
- •Задача идентификации. Транслитерация.
- •Методы лексического анализа.
- •Использование автомата для решения задачи идентификации слов (различные классы лексем).
- •Контекстно-свободные грамматики. Основные определения.
- •Задание кс грамматики. Способы задания грамматик: синтаксические диаграммы, форма Бекуса-Наура.
- •Выводы. Деревья синтаксического разбора.
- •Праволинейная грамматика.
- •Лишние нетерминалы.
- •Атрибутные грамматики. Наследуемые и синтезируемые атрибуты.
- •1 Синтезируемые атрибуты
- •2 Наследуемые атрибуты
- •Использование автоматов с магазинной памятью для нисходящего разбора.
- •Общие правила построения нисходящего распознающего автомата.
- •Распознающий автомат для s - грамматик.
- •Ll(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: Вытолкнуть, Сдвиг
Описание ошибки
Pa: Запятая стоит там, где ожидалось “a” или открывающая скобка
Pb: Закрывающая скобка стоит там, где ожидалось “a” или открывающая скобка
Pс: <S>-выражение не закончено: возможно пропущено “a”
Pd: “a” стоит там, где ожидалась запятая или закрывающая скобка
Pe: Открывающая скобка стоит там, где ожидалась запятая или закрывающая скобка
Pf: <R>-выражение не закончено: возможно пропущена закрывающая скобка
Pg: “a” встретилось после окончания <S>-правила (группа выражений)
Ph: Открывающая скобка встретилась после окончания <S>-правила
Pi: Запятая встретилась после окончания <S>-правила
Pj: Возможно неправильно поставлены скобки
Нейтрализация ошибки – процесс изменения конфигурации синтаксического анализатора: на основе полученной ошибки, мы изменяем ход синтаксического разбора так, чтобы это могло привести к какому-то результату. Например, попробовать подставить точку с запятой при ее пропуске.
Глобальная нейтрализация
Главная цель: когда во входной цепочке встретилась ошибка, а синтаксический анализ необходимо продолжать, то во входной цепочке делается переход. Этот переход продолжается до тех пор, пока не будет найден входной символ из множества «надежных». И нейтрализация будет зависеть от этого входного символа и верхнего магазинного символа.
«Надежные» символы бывают двух классов:
Синхронизирующие символы – символы, относительно которых можно с высокой степенью вероятности возобновить процесс синтаксического анализа. К таким классам в Паскале, например, относят: “end.”, “;”, “)”, “then”.
Начинающие символы
Локальная нейтрализация
1. Генерация сообщения об ошибке
2. Втолкнуть ({ошибка})
3. Втолкнуть (<S>)
Если дальше снова пошли ошибки, возможно они являются следствием первой ошибки. В этом случае можно продолжить обработку дальше, либо закончить анализ, выдав сообщение об ошибке.
Локальная нейтрализация
Эвристика – способ отсеивания заведомо неверных путей. Применяется для сокращения времени выполнения.
Идея метода: если обнаруживается какая-то локальная ошибка, то выдается сообщение, выполняются операции по нейтрализации ошибки (для каждого события разрабатывается набор действий над входной цепочкой и магазином, которые нейтрализуют ошибку). После выполнения этих действий синтаксический разбор продолжается.
После выдачи сообщений Pa и Pb: Вытолкнуть, Держать
После выдачи сообщений Pd и Pe: Заменить(<R><S>), Держать
После выдачи сообщений Pc и Pf: Вытолкнуть, Выход