
- •Теория вычислительных процессов и структур
- •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. Ошибки, связанные с нарушением ограничений
5.2. Lr(1) - таблица разбора
Выше мы рассмотрели технологию разбора «снизу вверх». Однако при этом не обсуждался вопрос, как решить, следует ли выполнять конкретное приведение, когда правая часть правила появляется в вершине стека. Механизмом, который регулирует вопрос принятия правильного решения, является таблица разбора.
Таблица представляет собой матрицу. Она состоит из столбцов для каждого терминала и нетерминала грамматики плюс знак окончания и строк, соответствующих каждому состоянию, в котором может находиться анализатор. Каждое состояние соответствует той позиции в порождающем правиле, которой достиг анализатор. Таблица разбора для грамматики
S real IDLIST
IDLIST IDLIST, ID
IDLIST ID
ID A B C D
приведена в табл. 5.1. Драйвер анализатора использует еще и два стека – стексимволови стексостояний. Таблица разбора включает элементы четырех типов.
Элементы сдвига. Эти элементы имеют видS7 и означают: поместить в стек символ, соответствующий столбцу; поместить в стек состояний 7 и перейти к состоянию 7; если входной символ – терминал, принять его.
Элемент приведения. Он имеет видR4 и означает: выполнить приведение с помощью правила 4), т.е., допустив, чтоnесть число символов в правой части правила 4), удалитьn элементов из стека символов иn элементов из стека состояний и перейти к состоянию, указанному в верхней части стека состояний. Нетерминал в левой части правила (4) нужно считать следующим входным символом.
Элемент ошибок. Эти элементы являются пробелами в таблице и соответствуют синтаксическим ошибкам.
Элемент остановки. Им завершается разбор.
Таблица 5.1.
Состояние |
S |
IDLIST |
ID |
real |
«,» |
A B C D |
|
1 2 3 4 5 6 7 |
HALT |
S5 |
S4 |
S2 |
R4 R3 S6
R2 |
S3
S3
|
R4 R3 R1
R2 |
Рассмотрим, как с помощью вышеописанной таблицы разбирается строка:
real A, B, C
|
Стек символов |
|
Стек состояний |
real A, B, C |
|
|
1 |
входной символ real – из элемента таблицы (1, real), сдвиг в состояние 2;
real A, B, C |
real |
|
2 1 |
входной символ А– сдвиг в состояние 3;
real A, B, C |
А real |
|
3 2 1 |
входной символ – «,», приведение по правилу (4);
real A, B, C |
real |
|
2 1 |
входной символ – ID, сдвиг в состояние 4;
real A, B, C |
ID real |
|
4 2 1 |
входной символ – «,», приведение по правилу (3);
real A, B, C |
real |
|
2 1 |
входной символ – IDLIST, сдвиг в состояние 5;
real A, B, C |
IDLIST real |
|
5 2 1 |
входной символ – «,», сдвиг в состояние 6;
real A, B, C |
, IDLIST real |
|
6 5 2 1 |
входной символ – В, сдвиг в состояние 3;
real A, B, C |
В , IDLIST real |
|
3 6 5 2 1 |
входной символ – «,», приведение по правилу (4);
real A, B, C |
, IDLIST real |
|
6 5 2 1 |
входной символ – ID, сдвиг в состояние 7;
real A, B, C |
ID , IDLIST real |
|
7 6 5 2 1 |
входной символ – «,», приведение по правилу (2);
real A, B, C |
real |
|
2 1 |
входной символ – IDLIST, сдвиг в состояние 5;
real A, B, C |
IDLIST real |
|
5 2 1 |
входной символ – «,», сдвиг в состояние 6;
real A, B, C |
, IDLIST real |
|
6 5 2 1 |
входной символ – С, сдвиг в состояние 3;
real A, B, C |
С , IDLIST real |
|
3 6 5 2 1 |
входной символ – «», приведение по правилу (4);
real A, B, C |
, IDLIST real |
|
6 5 2 1 |
входной символ – ID, сдвиг в состояние 7;
real A, B, C |
ID , IDLIST real |
|
7 6 5 2 1 |
входной символ – «», приведение по правилу (2);
real A, B, C |
real |
|
2 1 |
входной символ – IDLIST, сдвиг в состояние 5;
real A, B, C |
IDLIST real |
|
5 2 1 |
входной символ – «», приведение по правилу (1);
real A, B, C |
|
|
1 |
входной символ – S, поэтомуHALT (ОСТАНОВ).
Разбор завершен успешно.
Заметим, что после сдвига входным символом является следующий символ, а после приведения – символ, к которому только что привело действие.