
- •Теория вычислительных процессов и структур
- •1. Предварительные математические сведения
- •1.2. Операции над множествами Объединение множеств
- •Пересечение множеств
- •Разность множеств
- •1.3. Множества цепочек
- •1.4. Языки
- •1.5. Алгоритмы
- •1.6. Некоторые понятия теории графов
- •2. Введение в компиляцию
- •2.1. Задание языков программирования
- •2.2. Синтаксис и семантика
- •2.3. Процесс компиляции
- •2.4. Лексический анализ
- •2.5. Работа с таблицами
- •2.6. Синтаксический анализ
- •2.7. Генератор кода
- •Алгоритм.
- •2.8. Оптимизация кода
- •2.9. Исправление ошибок
- •2.10. Резюме
- •3. Теория языков
- •3.1. Способы определения языков
- •3.2. Грамматики
- •Пример.
- •3.3. Грамматики с ограничениями на правила
- •3.4. Распознаватели
- •3.5. Регулярные множества, их распознавание
- •3.6. Регулярные множества и конечные автоматы
- •3.7. Графическое представление конечных автоматов
- •3.8. Конечные автоматы и регулярные множества
- •3.9. Минимизация конечных автоматов
- •3.10. Контекстно-свободные языки
- •3.10.1. Деревья выводов
- •3.10.2. Преобразование кс–грамматик
- •3.10.3. Грамматика без циклов
- •3.10.4. Нормальная форма Хомского
- •3.10.5. Нормальная формула Грейбах
- •3.11. Автоматы с магазинной памятью
- •3.11.1. Основные определения
- •3.11.2. Эквивалентность мп-автоматов и кс-грамматик
- •4.1. Эквивалентность мп-автоматов и кс-грамматик
- •4.2. Ll(1)-грамматики
- •4.3. Ll(1)-таблица разбора
- •5. Синтаксический анализ снизу вверх
- •5.1. Разбор снизу вверх
- •5.2. Lr(1) - таблица разбора
- •5.3. Построение lr – таблицы разбора
- •5.4. Сравнение ll – и lr – методов разбора
- •6. Включение действий в синтаксис
- •6.1. Получение четверок
- •6.2. Работа с таблицей символов
- •7. Проектирование компиляторов
- •7.1. Число проходов
- •7.2. Таблицы символов
- •Identifier, type.
- •Int procedure rehash(int n)
- •Int procedure rehash(int n)
- •7.3. Таблица видов
- •8. Распределение памяти
- •8.1. Стек времени прогона
- •Integer a, b, X, y
- •Int table[1:10, -5:5].
- •8.2. Методы вызова параметров
- •8.3. Обстановка выполнения процедур
- •8.4. «Куча»
- •8.5. Счетчик ссылок
- •8.6. Сборка мусора
- •9. Генерация кода
- •(Тип – адреса, номер - блока, смещение).
- •9.2. Структура данных для генерации кода
- •9.3. Генерация кода для типичных конструкций
- •9.3.1. Присвоение
- •9.3.2. Условные зависимости
- •If b then c else d
- •9.3.3. Описание идентификаторов
- •9.3.4. Циклы
- •9.3.5. Вход и выход из блока
- •9.3.6. Прикладные реализации
- •9.4. Проблемы, связанные с типами
- •9.5. Время компиляции и время прогона
- •10. Исправление и диагностика ошибок
- •10.1. Типы ошибок
- •10.2. Лексические ошибки
- •10.3. Ошибки в употреблении скобок
- •Begin end
- •Case esac
- •10.4. Синтаксические ошибки
- •10.5. Методы исправления синтаксических ошибок
- •End begin
- •10.6. Предупреждения
- •10.7. Сообщения о синтаксических ошибках
- •10.8. Контекстно-зависимые ошибки
- •Identifier xyz not declared
- •Identifier blank alredy declared in block
- •10.9. Ошибки, связанные с употреблением типов
- •Int I; char c;
- •10.10. Ошибки, допускаемые во время прогона
- •10.11. Ошибки, связанные с нарушением ограничений
3.11.2. Эквивалентность мп-автоматов и кс-грамматик
В теории перевода можно показать, что языки определяемые МП-автоматами, – это в точности КС-языки. Начнем с построения естественного (недетерминированного) «нисходящего» распознавателя, эквивалентного данной КС-грамматике.
Лемма.
Пусть
- КС-грамматика. По грамматике
G
можно построить такой МП-автомат R,
что
.
Доказательство.
Построим R так, чтобы он моделировал все левые выводы в G.
Пусть
,
где
определяется следующим образом:
если А а принадлежит Р, то
содержит
;
для всех
.
Мы
хотим показать, что
тогда и только тогда, когда
⊢n
для
некоторых
.
Необходимость
этого условия докажем индукцией по m.
Допустим, что
.
Если m=1
и
,
то
⊢
⊢k
.
Теперь
предположим, что
для некоторого m>1.
Первый шаг этого вывода должен иметь
вид
,
где
для некоторого
и
.
Тогда
⊢
.
Если
,
то по предложению индукции
⊢*
.
Если
,
то
⊢
.
Объединяя вместе эти последовательности
тактов, видим, что
⊢+
.
Для
доказательства достаточности покажем
индукцией по n,
что, если
⊢n
,
то
.
Если
n=1,
то w=e
и Ae
принадлежит Р.
Предположим, что утверждение верно для
всех
.
Тогда первый такт, сделанный МП-автоматом
R,
должен иметь вид
⊢
,
причем
⊢ni
для
и
.
Тогда
- правило из Р,
и по предложению индукции
для
.
Если
,
то
.
Таким образом
- вывод цепочки w из А в грамматике G.
Контрольные вопросы
Способы определения языков.
Грамматики.
Грамматики с ограничениями на правила.
Распознаватели.
Регулярные множества, их распознавание и порождения.
Алгоритм решения системы линейных выражений с регулярными выражениями.
Регулярные множества и конечные автоматы.
Проблема разрешимости.
Графическое представление конечных автоматов.
Минимизация конечных автоматов.
Алгоритм построения канонического конечного автомата. Контекстно-свободные грамматики.
Деревья выводов. Преобразование КС-грамматик.
Алгоритм устранения недостижимых символов.
Алгоритм устранения бесполезных символов.
Алгоритм преобразования в грамматику без е-правил. Алгоритм устранения цепных правил.
Грамматики без циклов. Нормальная форма Хомского. Алгоритм преобразования к нормальной форме Хомского.
Нормальная форма Грейбах.
Алгоритм устранения левой рекурсии.
Автоматы с магазинной памятью.
4. КС-грамматики и синтаксический анализ сверху вниз
4.1. Эквивалентность мп-автоматов и кс-грамматик
В практических приложениях нас больше будут интересовать детерминированные МП-автоматы, т.е. такие, которые в каждой конфигурации могут сделать не более одного очередного такта. Языки, определяемые детерминированными МП-автоматами, называются детерминированными КС-языками, а их грамматики - LR(k)-грамматиками.
Определение.
МП-автомат
называется детерминированным
(ДМП),
если для каждых
и
либо
содержит не более одного элемента для каждого
и
, либо
для всех
и
содержит не более одного элемента.
Соглашение.
Так
как ДМП-автомат содержит не более одного
элемента, мы будем писать
вместо
.
Как уже отмечалось, однотактовые детерминированные МП-автоматы порождают КС-языки, которые называются LR(k)-грамматиками. Те в свою очередь являются частным случаем s-грамматик.
Определение. s-грамматика представляет собой грамматику, в которой:
правые части каждого порождающего правила начинаются с терминала;
в тех случаях, когда в левой части более чем одного порождающего правила появляется нетерминал, соответствующие правые части начинаются с различных терминалов.
Первое условие аналогично утверждению, что грамматика находится в нормальной форме Грейбах, только за терминалом в начале каждой правой части правила могут следовать нетерминалы и/или терминалы.
Второе условие соответствует существованию детерминированного одношагового МП-автомата.
Пример.
SpX SqY XaXb |
Xx YaYd Yy |
Рассмотрим проблему разбора строки paaaxbbb с помощью заданной s-грамматики. Начав с символа S, попытаемся генерировать строку, применяя левосторонний вывод. Результаты приведены в табл. 4.1.
Таблица 4.1.
Исходная строка |
Вывод |
paaaxbbb paaaxbbb paaaxbbb paaaxbbb paaaxbbb paaaxbbb |
S PX PaXb PaaXbb PaaaXbbb Paaaxbbb |