
- •Введение
- •1 Предварительные математические сведения
- •1.1 Множества
- •1.2 Операции и отношения
- •1.2.1 Операции над множествами
- •1.2.2 Отношения на множествах
- •1.3.1 Цепочки
- •1.3.2 Операции над цепочками
- •1.4.2 Операции над языком
- •1.5 Алгоритмы
- •1.5.1 Частичные алгоритмы
- •1.5.2 Всюду определенные алгоритмы
- •1.5.3 Рекурсивные алгоритмы
- •1.5.4 Задание алгоритмов
- •1.5.5 Проблемы
- •1.6 Некоторые понятия теории графов
- •1.6.1 Ориентированные графы
- •1.6.2 Ориентированные ациклические графы
- •1.6.3 Деревья
- •1.6.4 Упорядоченные графы
- •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.1 Определения
- •3.8 Конечные автоматы и регулярные множества
- •3.9.1 Постановка задачи
- •3.10 Контекстно-свободные языки
- •3.10.2 Преобразование КС-грамматик
- •3.10.2.1. Алгоритм проверки пустоты языка
- •3.10.2.2. Алгоритм устранения недостижимых символов
- •3.10.2.3. Алгоритм устранения бесполезных символов
- •3.10.2.5. Алгоритм устранения цепных правил
- •3.10.3 Грамматика без циклов
- •3.10.4 Нормальная форма Хомского
- •3.10.5 Нормальная форма Грейбах
- •3.11 Автоматы с магазинной памятью
- •3.11.1 Основные определения
- •4.1 LL(k)-грамматики
- •4.2.2 Алгоритм поиска направляющих символов
- •4.2.2.1 Множество предшествующих символов
- •4.2.2.2 Множество последующих символов
- •4.2.2.3 Множество направляющих символов
- •4.3 LL(1)-таблица разбора
- •4.3.1 Построение таблицы
- •5 Синтаксический анализ снизу вверх
- •5.1 LR(k)-грамматики
- •5.2 LR(1)-грамматики
- •5.3 LR(1)-таблица разбора
- •5.3.1 Состояния анализатора
- •5.3.2 Построение таблицы
- •5.3.3 LR-конфликты
- •5.3.4 Разбор цепочки по таблице
- •5.4 Сравнение LL- и LR-методов разбора
- •6 Включение действий в синтаксис
- •6.2 Работа с таблицей символов
- •7 Проектирование компиляторов
- •7.1 Число проходов
- •7.2 Таблицы символов
- •7.2.2 Бинарное дерево
- •7.4.1 Стек времени прогона
- •7.4.2 Методы вызова параметров
- •7.4.3 Обстановка выполнения процедур
- •8 Генерация кода
- •8.1 Генерация промежуточного кода
- •8.2 Структура данных для генерации кода
- •8.3.1 Присвоение
- •8.3.2 Условные зависимости
- •8.3.3 Описание идентификаторов
- •8.3.4 Циклы
- •8.3.5 Вход и выход из блока
- •8.3.6 Прикладные реализации
- •8.4 Проблемы, связанные с типами
- •8.5 Время компиляции и время прогона
- •9 Исправление и диагностика ошибок
- •9.1 Типы ошибок
- •9.2 Лексические ошибки
- •9.3 Ошибки в употреблении скобок
- •9.4 Синтаксические ошибки
- •9.4.1 Методы исправления синтаксических ошибок
- •9.4.2 Предупреждения
- •9.4.3 Сообщения о синтаксических ошибках
- •9.5 Контекстно-зависимые ошибки
- •9.6 Ошибки, связанные с употреблением типов
- •9.7 Ошибки, допускаемые во время прогона
- •9.8 Ошибки, связанные с нарушением ограничений
- •Заключение
- •Список литературы
- •Глоссарий

18
Дадим еще ряд определений:
1)множество S конечно, если оно равномощно множеству {1, 2, …, n}
для некоторого целого n;
2)множество S бесконечно, если оно равномощно некоторому своему собственному подмножеству;
3)множество S счетное, если оно равномощно множеству положи-
тельных чисел.
1.3МНОЖЕСТВА ЦЕПОЧЕК
1.3.1 ЦЕПОЧКИ
Алфавитом будем называть любое множество символов (оно не обяза-
тельно конечно и даже счетно), но в наших приложениях оно конечно. Пред-
полагается, что слово «символ» имеет достаточно ясный интуитивный смысл. Символ – элемент алфавита (синонимы: буква, знак).
· · · · · · · · · · · · · · · · · · · · · · · · |
|
Пример · · · · · · · · · · · · · · · · · · · · · · · |
|
|
|
Например, 01011 – цепочка в бинарном алфавите {0, 1}.
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Особый вид цепочки – пустая цепочка [3, 5], обозначается как e. Пустая цепочка не содержит символов.
Соглашения:
–Прописные буквы греческого алфавита – алфавиты.
–Буквы a, b, c и d – отдельные символы.
–Буквы t, u, v, w, x, y и z – цепочки символов.
Если цепочку из i символов a обозначить как ai, тогда a0 = e – пустая цепочка.
Цепочки в алфавите Σ определяются следующим образом:
1) e – цепочка в Σ;

19
2)если x цепочка в Σ и a Σ, то xa – цепочка в Σ;
3)y – цепочка в Σ тогда и только тогда, когда она является таковой в силу 1) и 2).
1.3.2 ОПЕРАЦИИ НАД ЦЕПОЧКАМИ
Пусть x, y – цепочки. Тогда:
–Цепочка xy называется сцепленной (конкатенацией цепочек x и y).
Например, если x = ab и y = cd, то xy = abcd. Для любой цепочки x
можно записать, что xе = еx = x.
–Обращением цепочки x (xR) называется цепочка x, записанная в обратном порядке: x = a1a2…an, xR = anan–1…a1, eR = e.
–Пусть x, y, z – цепочки в некотором алфавите Σ, тогда, x – префикс
цепочки xy, y – суффикс цепочки xy, y – подцепочка цепочки xyz.
Префикс и суффикс цепочки являются ее подцепочками. Если x ≠ y, x –
префикс (суффикс) цепочки y, то x – собственный префикс (суффикс) цепоч-
ки y.
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Длина цепочки – это число символов в ней. Если x = a1a2…an, то длина цепочки n. Длину цепочки обозначают |x|.
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
· · · · · · · · · · · · · · · · · · · · · · · · |
|
Пример · · · · · · · · · · · · · · · · · · · · · · · |
|
|
|
Например:
–|abc| = 3;
–|e| = 0.
·· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

20
1.4ЯЗЫКИ
1.4.1ОПРЕДЕЛЕНИЯ
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Языком в алфавите Σ называют множество цепочек в Σ.
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Через Σ* обозначается множество, содержащее все цепочки в алфавите,
включая e [6].
· · · · · · · · · · · · · · · · · · · · · · · · |
|
Пример · · · · · · · · · · · · · · · · · · · · · · · |
|
|
|
Пусть Σ – бинарный алфавит {0,1}, тогда Σ* = {e, 0, 1, 00, 01, 10, 11, 000, 001, …,}.
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Каждый язык в алфавите Σ является подмножеством Σ*. Множество всех цепочек в Σ, за исключением e, обозначают Σ+.
Если язык L таков, что полная цепочка в L не является собственным подмножеством (суффиксом) никакой другой цепочки в L, то L обладает префиксным (суффиксным) свойством.
1.4.2 ОПЕРАЦИИ НАД ЯЗЫКОМ
Так как языки являются множествами, то все операции над множества-
ми применимы к ним. Операцию конкатенации можно применять к языкам так же, как и к цепочкам.
Пусть L1 – язык в Σ1, L2 – язык в Σ2. Тогда язык L1L2 называется конка-
тенацией языков L1 и L2 – это язык {xy | x L1 и y L2}. Итерация языка L обо-
значается L* и определяется следующим образом:
1)L0 = {e};
2)Ln = LLn–1 для n 1;

21
3) L* Ln .
n 0
Позитивная итерация языка L обозначается L+ – это язык
Ln , т.е. L* L {e}.
n 1
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Пусть Σ1 и Σ2 – алфавиты. Гомоморфизмом называется любое отображение h : 1 *2 .
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Область гомоморфизма можно расширить до 1* , полагая h(e) = e и
h(xa) = h(x)h(a) для всех x * и a Σ . |
|||
1 |
1 |
|
|
· · · · · · · · · · · · · · · · · · · · · · · · |
|
|
Пример · · · · · · · · · · · · · · · · · · · · · · · |
|
|
||
|
|
|
|
Если мы хотим заменить каждое вхождение в цепочку символа 0 на a, а
каждое вхождение символа 1 на bb, то можно определить гомоморфизм h так: h(0) = a, h(1) = bb. Если L = {0n1n | n 1}, то h(L) = {anb2n | n 1}.
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Если h : 1 *2 , то отношение
h 1 : *2 P 1*
называется обращением гомоморфизма.
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Если y *2 , то h–1(y) – это множество цепочек в алфавите Σ1, т.е. h–1(y) = {x | h(x) = y}. Если L – язык в алфавите Σ2, то h–1(L) – язык в алфавите Σ1, состоящий из тех же цепочек, которые h отображает в цепочки из L. Фор-
мально,