- •Упрощенная модель компилятора. Проходы компилятора.
- •3. Проходы компиляторов
- •Задача идентификации. Транслитерация.
- •Методы лексического анализа.
- •Использование автомата для решения задачи идентификации слов (различные классы лексем).
- •Контекстно-свободные грамматики. Основные определения.
- •Задание кс грамматики. Способы задания грамматик: синтаксические диаграммы, форма Бекуса-Наура.
- •Выводы. Деревья синтаксического разбора.
- •Праволинейная грамматика.
- •Лишние нетерминалы.
- •Атрибутные грамматики. Наследуемые и синтезируемые атрибуты.
- •1 Синтезируемые атрибуты
- •2 Наследуемые атрибуты
- •Использование автоматов с магазинной памятью для нисходящего разбора.
- •Общие правила построения нисходящего распознающего автомата.
- •Распознающий автомат для s - грамматик.
- •Ll(1) - грамматики. Множество выбора.
- •Метод рекурсивного спуска.
- •Обработка ошибок при нисходящем разборе.Обнаружение и нейтрализация ошибок.
- •Восходящие методы синтаксического разбора. Метод перенос-свертка.
- •Задачи семантического анализа. Семантические соглашения.
Общие правила построения нисходящего распознающего автомата.
Определяется множество входных символов (множество терминалов, дополненных маркером окончания цепочки)
Определяется множество магазинных символов (множество состоит из маркера дна, а также всех нетерминальных символов, кроме крайнего левого в правой части правила).
Изначально в магазин заталкивается маркер дна и начальный нетерминал
Строится управляющая таблица (строки в которой помечены магазинными символами, столбцы – входными символами)
Определяются правила грамматики, которые применяются для соответствующего входного символа и магазинного символа. Правила грамматики применяются тогда, когда магазинный символ является левой частью этого правила, а входной символ принадлежит его множеству выбора.
Если правило имеет вид: <A> a , то пишем: Заменить(
),
СдвигЕсли правило имеет вид: <A> ε, то пишем: Вытолкнуть, Держать
Если имеется аннулирующее правило с нетерминалом <A> в его левой части, и элемент таблицы, соответствующий магазинному символу <A> и некоторому входному символу b не был создан, то пишем: Отвергнуть
Если терминал b является магазинным символом, то элементом таблицы, находящимся на пересечении столбца b и строки <B> будет: Вытолкнуть, Сдвиг
Элементом таблицы для столбца, помеченного концевым маркером и маркером дна, будет: Допустить
Если некий символ {x} является магазинным символом, то тогда для него во всей строчке будет: Выполнить(x), Вытолкнуть, Держать
Если после предыдущих пунктов какие-то ячейки остались незаняты, то их нужно заполнить действием: Отвергнуть.
Распознающий автомат для s - грамматик.
s-грамматика (simple, separated) – контекстно-свободная грамматика, для которой выполняются следующие условия:
Правая часть каждого правила начинается с терминального символа
Если два правила имеют одинаковые левые части, то правые части начинаются с различных терминальных символов
<S> aL, где L – любая последовательность терминальных и нетерминальных символов
Lr – любая последовательность терминальных и нетерминальных символов в реверсивном порядке
Примеры некорректных для s-грамматики правил:
<S> ε
<S> <A>a
<S> a<A>, <S> a<B>
Грамматика:
<S> ab<A>
<S> b<A>b<S>
<A> a
<A> b<A>
Входная цепочка: abba
Шаг 1. В магазин заталкиваем стартовый нетерминал <S>
Шаг 2. Маркер устанавливаем на “a”
Шаг 3. Используем первое правило: <A> на дне магазина, “b” над <A>
М
агазин:
abba abba abba abba
Цепочка корректна.
Пример некорректной цепочки: “ba”. Начинаем с использования правила 2. Магазин не останется пуст после разбора цепочки.
Алфавит: {a,b, }
Множество нетерминальных символов: {<S>,<A>, }
Операция «заменить» - верхний символ заменяем на обратную цепочку: <S> Lr
|
a |
B |
|
<S> |
#1 |
#2 |
ошибка |
<A> |
#3 |
#4 |
ошибка |
|
ошибка |
Ошибка |
допустить |
b |
ошибка |
вытолкнуть, сдвиг |
ошибка |
#1: Заменить (<A>b), Сдвиг
#2: Заменить (<S>b<A>), Сдвиг
#3: Вытолкнуть, Сдвиг
#4: Заменить(<A>), Сдвиг
s-грамматика распознается с помощью МП-автомата с применением расширенной магазинной операции «Заменить». Аргументом этой операции является цепочка, обратная цепочке, остающейся после первого терминального символа s-правила.
Q-грамматики. Множество выбора.
q-грамматика – контекстно-свободная грамматика (КСГ), для которой выполняются следующие условия:
Правая часть каждого правила начинается либо с терминального символа, либо является пустой цепочкой
Если два правила имеют одинаковые левые части, то множества выбора для этих правил не должны пересекаться (пересечения множеств выбора есть пустое множество)
q мощнее, чем s
Если в КСГ встречаются правила класса <A> ε, то для этого правила нужно найти функцию СЛЕД(<A>) во всех правилах грамматики, где встречается нетерминал <A>. Эта функция в результате дает множество, состоящее из терминальных символов и маркера окончания цепочки.
Q-грамматика:
<S> a<A><S> {a}
<S> b {b}
<A> c<A><S> {c}
<A> ε {a,b}
<A> ε СЛЕД(<A>) = {a,b}
Множество выбора правила N – это множество терминальных символов, для которых корректно применение правила N.
Входные
символы: {a,b,c,
}
Магазинные символы: <S>, <A>,
|
A |
b |
c |
|
<S> |
#1 |
#2 |
отвергнуть |
отвергнуть |
<A> |
#4 |
#4 |
#3 |
отвергнуть * |
|
отвергнуть |
отвергнуть |
отвергнуть |
допустить |
* - можно поступить двумя способами:
Применить правило #4
Отвергнуть (выберем это)
#1: Заменить (<S>,<A>), Сдвиг
#2: Вытолкнуть, Сдвиг
#3: Заменить (<S>,<A>), Сдвиг
#4: Вытолкнуть, Держать
