
- •Теория вычислительных процессов и структур
- •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.5. Регулярные множества, их распознавание
и порождение
Рассмотрим методы задания языков программирования и класс множеств, образующий этот класс языков. Основным аппаратом задания будут регулярные множества и регулярные выражения на них.
Определение.
Пусть - конечный алфавит. Регулярное множество в алфавите определяется рекурсивно следующим образом:
– (пустое множество) – регулярное множество в алфавите ;
{e} – регулярное множество в алфавите ;
{a} – регулярное множество в алфавите для каждого а;
если Р и Q – регулярное множество в алфавите , то таковы же и множества:
а) PQ;
б) PQ;
в) P*;
ничто другое не является регулярным множеством в алфавите .
Таким образом, множество в алфавите регулярно тогда и только тогда, когда оно либо , либо {e}, либо {а} для некоторого а, либо его можно получить из этих множеств применением конечного числа операций объединения, конкатенации и итерации.
Определение.
Регулярные выражения в алфавите и регулярные множества, которые они обозначают, определяются рекурсивно следующим образом:
– регулярное выражение, обозначающее регулярное множество ;
е – регулярное выражение, обозначающее регулярное множество {e};
если а, то а – регулярное выражение, обозначающее регулярное множество {a};
если р и q – регулярные выражения, обозначающие регулярные множества Р и Q, то
а) (p+q) – регулярное выражение, обозначающее РQ;
б) pq – регулярное выражение, обозначающее PQ;
в) (р)* - регулярное выражение, обозначающее Р*;
ничто другое не является регулярным выражением.
Принято обозначать р+ для сокращенного обозначение рр*. Расстановка приоритетов:
* (итерация)- наивысший приоритет;
конкатенация;
+.
Таким образом, 0 + 10* = (0 + (1 (0*)))
Пример.
01 означает {01}
0* {0*}
(0+1)* {0, 1}*
(0+1)* 011 – означает множество всех цепочек, составленных из 0 и 1 и оканчивающихся цепочкой 011.
(а+b) (а+b+0+1)* означает множество всех цепочек {0,1,a,b}*, начинающихся с а или b.
(00+11)* ((01+10)(00+11)* (01+10)(00+11)*) обозначает множество всех цепочек нулей и единиц, содержащих четное число 0 и чётное число 1. Таким образом для каждого регулярного множества можно найти регулярное выражение, его обозначающее, и наоборот.
Введем леммы, обозначающие основные алгебраические свойства регулярных выражений.
Пусть и регулярные выражения, тогда:
+
* = е
е = е =
*=+*
(*)*=*
.
При работе с языками часто удобно пользоваться уравнениями, коэффициентами и неизвестными которых служат множества. Такие уравнения будем называть уравнениями с регулярными коэффициентами
,
где а и b– регулярные выражения. Можно проверить прямой подстановкой, что решением этого уравнения будет а*b.
,
т.е. получаем одно и то же множество. Таким же образом можно установить и систему уравнений.
Определение.
Систему уравнений с регулярными
коэффициентами назовём стандартной
системой
с множеством неизвестных
,
если она имеет вид:
где
– регулярные выражения в алфавите, не
пересекающемся с . Коэффициентами
уравнения являются выражения
.
Если
=,
то в уравнении нет числа, содержащего
.
Аналогично, если
=е,
то в уравнении для
член,
содержащий
- это просто
.
Иными словами, играет роль коэффициента
0, а е
– роль коэффициента 1 в обычных линейных
уравнениях.
Алгоритм решения стандартной системы уравнений с регулярными выражениями.
Вход.
Стандартная система Q
уравнений с регулярными коэффициентами
в алфавите и множеством неизвестных
.
Выход. Решение системы Q .
Метод: Аналог метода решения системы линейных уравнений методом исключения Гаусса.
Шаг 1. Положить i = 1.
Шаг
2. Если i
= n,
перейти к шагу 4. В противном случае с
помощью тождеств леммы записать уравнения
для
в виде
,
где - регулярное выражение в алфавите
, а - регулярное выражение вида:
,
причём все
– регулярные выражения в алфавите .
Затем в правых частях для уравнений
заменим
регулярным выражением
.
Шаг 3. Увеличить i на 1 и вернуться к шагу 2.
Шаг
4. Записать уравнение для
в виде
,
где и - регулярные выражения в
алфавите . Перейти к шагу 5 (при этом
i=n).
Шаг
5. Уравнение для
имеет
вид
,
где и - регулярные выражения в
алфавите . Записать на выходе
в уравнениях для
подставляя
вместо
.
Шаг 6. Если i=1, остановиться, в противном случае уменьшить i на 1 и вернуться к шагу 5.
Однако следует отметить, что не все уравнения с регулярными коэффициентами обладают единственным решением. Например, если
-
уравнение с регулярными коэффициентами
и означает множество, содержащее
пустую цепочку, то
будет решением этого уравнения для
любого . Таким образом, уравнение имеет
бесконечно много решений. В такого рода
ситуациях мы будем брать наименьшее
решение, которое назовем наименьшей
неподвижной точкой.
В нашем случае наименьшая неподвижная
точка
.
Лемма.
Каждая стандартная система уравнений Q с неизвестными обладает единственной наименьшей неподвижной точкой.
Определение.
Пусть
Q – стандартная система уравнений с
множеством неизвестных
в алфавите . Отображение f
множества во множество языков в
алфавите называется решением системы
Q, если после подстановки в каждое
уравнение f(x)
вместо
Х
для каждого Х
уравнения становятся равенствами
множеств.
Отображение f:P(*) называется наименьшей неподвижной точкой системы Q, если f решение, и для любого другого решения g f(x)g(x) для всех Х..
Лемма.
Пусть Q – стандартная система уравнений
с неизвестными
,
и уравнение для
имеет
вид
.
Тогда наименьшей неподвижной точкой системы Q будет такое отображение
для
некоторой последовательности чисел
,
где m,
km,
j1=i.
Примем в качестве аксиомы утверждение, что язык определяется праволинейной грамматикой тогда и только тогда, когда он является регулярным множеством. Таким образом, констатируем:
класс регулярных множеств – наименьший класс языков, содержащих множества , {e} и {a} для всех символов а и замкнутый относительно операций объединения, конкатенации и итерации;
регулярные множества – множества, определённые регулярными выражениями;
регулярные множества – языки, порождаемые праволинейными грамматиками.