- •Теория вычислительных процессов и структур
 - •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.7. Графическое представление конечных автоматов
Определение. Пусть М = (Q,   q0, F) – недетерминированный конечный автомат. Диаграммой  переходов (графом переходов) автомата М называется неупорядоченный помеченный граф, вершины которого помечены именами состояний и в котором есть дуга (р, q), если существует такой символ а, что q (р, а). Кроме того, дуга (р,q) помечается списком, состоящим из таких а, что q (р, а). Изобразим автоматы из предыдущих примеров в виде графов (рис. 3.2 и 3.3)

Рис. 3.2. Пример детерминированного графа
Для дальнейшего анализа нам потребуется определение детерминированного автомата.
Определение.
Пусть М = (Q,   q0, F) – недетерминированный конечный автомат. Назовём автомат М детерминированным, если множество (q, а) содержит не более одного состояния для любых qQ и а. Если (q,а) всегда содержит точно одно состояние, то автомат М назовём полностью определённым.

Рис. 3.3. Пример недетерминированного графа
Таким образом, наш пример – полностью определённый детерминированный конечный автомат, и в дальнейшем под конечным автоматом мы будем подразумевать полностью определённый конечный автомат.
Одним из важнейших результатов теории конечных автоматов является тот факт, что класс языков, определяемых недетерминированными конечными автоматами, совпадает с классом языков, определяемых детерминированными конечными автоматами.
Теорема.
Если L=L(M) для некоторого недетерминированного конечного автомата, то L=L(M') для некоторого конечного автомата М'.
Пусть М = (Q,   q0, F). Построим автомат М' = (Q',  ' q0', F') следующим образом:
Q' = P(Q), т.е. состояниями автомата М' является множество состояний автомата М;
q0'={q0};
F' состоит из всех таких подмножеств S множества Q, что SF;
(S, а) = S' для всех SQ, где S'={p | (q, а) содержит р для некоторого qS}.
Пример.
Построим конечный автомат М' = (Q,{1, 2, 3},', {q0}, F), допускающий язык L(M).
Так как М имеет 5 состояний, то в общем случае М' должен иметь 32 состояния. Однако, не все они достижимы из начального состояния. Состояние р называется достижимым, если существует такая цепочка w, что (q0, w)⊢∗(р, е), где q0 - начальное состояние. Мы будем строить только достижимые состояния (табл. 3.3).
Таблица 3.3 - Достижимые состояния автомата
| 
			 Состояние  | 
			 Вход  | ||
| 
			 1  | 
			 2  | 
			 3  | |
| 
			 А = {q0}  | 
			 В  | 
			 С  | 
			 D  | 
| 
			 В = {q0, q1}  | 
			 Е  | 
			 F  | 
			 G  | 
| 
			 С = {q0, q2}  | 
			 F  | 
			 H  | 
			 I  | 
| 
			 D = {q0, q3}  | 
			 G  | 
			 I  | 
			 J  | 
| 
			 E = {q0, q1, qf}  | 
			 E  | 
			 F  | 
			 G  | 
| 
			 F = {q0, q1, q2}  | 
			 K  | 
			 K  | 
			 L  | 
| 
			 G = {q0, q1, q3}  | 
			 M  | 
			 L  | 
			 M  | 
| 
			 Н = {q0, q2, qf}  | 
			 F  | 
			 H  | 
			 I  | 
| 
			 I = {q0, q2, q3}  | 
			 L  | 
			 N  | 
			 N  | 
| 
			 J = {q0, q3, qf}  | 
			 G  | 
			 I  | 
			 J  | 
| 
			 К = {q0, q1, q2, qf}  | 
			 К  | 
			 К  | 
			 L  | 
| 
			 L= {q0, q1, q2,q3}  | 
			 Р  | 
			 Р  | 
			 Р  | 
| 
			 М = {q0, q1, q3, qf}  | 
			 М  | 
			 L  | 
			 М  | 
| 
			 N = {q0, q2, q3, qf}  | 
			 L  | 
			 N  | 
			 N  | 
| 
			 Р = {q0, q1,q2, q3, qf}  | 
			 Р  | 
			 Р  | 
			 Р  | 
Начнём с замечания, что состояние {q0} достижимо. ' ({q0}, а) = {q0, qа} для а = 1, 2, 3. Рассмотрим состояние {q0, q1}. Имеем ' ({q0, q1},1) = {q0, q1, qf}. Продолжая, по данной схеме, получаем, что множество состояний автомата М (М) достижимо тогда и только тогда, когда
оно содержит q0 и
если оно содержит qf, то содержит также и q1, q2 или q3.
Начальным состоянием автомата М является А, а множество заключительных состояний - {Е, Н, J, К, М, N, Р}.
