
- •1 Введение
- •2.1 Синтаксис языковых конструкций
- •2.1.1 Синтаксис описания переменных
- •2.1.1.1 Язык Pascal
- •2.1.1.2 Язык C/C++
- •2.1.1.3 Язык C#
- •2.1.2 Синтаксис описания записей и структур
- •2.1.2.1 Язык Pascal
- •2.1.2.2 Язык C/C++
- •2.1.2.3 Язык C#
- •2.1.3 Синтаксис описания функций, процедур и делегатов
- •2.1.3.1 Язык Pascal
- •2.1.3.2 Язык C++
- •2.1.3.3 Язык C#
- •2.2.1 Построение дерева
- •2.2.2 Лексический анализ
- •2.2.3 Работа с таблицей имен
- •2.2.4 Синтаксический анализ
- •2.2.5 Генерация кода
- •2.2.6 Оптимизация кода
- •2.3.1 Основные определения
- •2.3.2 Способы задания ДМП-автомата
- •2.3.3 Включение действий в синтаксис и алгоритм разбора
- •2.4.1 Основные определения
- •2.4.3 Программирование регулярных выражений
- •2.4.4 Включение действий и поиск ошибок
- •2.4.5 Сбалансированные определения
- •2.5.1 Составление правил грамматик
- •2.5.2 Включение действий в синтаксис
- •2.5.3 Разбор по символам и по лексемам
- •2.5.4 LL(1)-грамматики
- •2.5.4.1 Общие определения
- •2.5.4.2 Определение множеств направляющих символов
- •2.5.4.3 Построение таблицы разбора
- •2.5.4.4 Разбор цепочки по таблице
- •2.5.5 LR(1)-грамматики
- •2.5.5.1 Общие определения
- •2.5.5.2 Определение множества состояний и графа переходов
- •3.5.5.2 Построение таблицы разбора
- •2.5.5.4 Разбор цепочки по таблице
- •3 Задание на лабораторные работы
- •3.1 Лабораторная работа №1
- •3.2 Лабораторная работа №2
- •3.3 Лабораторная работа №3
- •3.4 Лабораторная работа №4
- •4 Отчет по лабораторным работам
- •Список литературы

35
2.3.2 СПОСОБЫ ЗАДАНИЯ ДМП-АВТОМАТА
Существуют различные способы задания ДМПА – например, матема-
тическое описание (в виде рассмотренной выше семерки). Однако для наглядности функцию переходов можно задавать в виде графа переходов или таблицы переходов.
Так, на рис. 2.5 изображена часть графа переходов ДМПА, соответ-
ствующая переходу δ(q, a, Z) = (q', ).
q
(a, Z, )
q'
Рисунок 2.5 – Переход в графе ДМПА
В графе переходов ДКА дуги достаточно помечать только символами алфавита Σ (рис. 2.6).
q
a
q'
Рисунок 2.6 – Переход в графе ДКА
Если состояние q является конечным, т.е. q F, то на графе оно отобра-
жается в виде окружности с двойной границей (рис. 2.7).

36
q
a
q'
Рисунок 2.7 – Переход в конечное состояние ДКА
Проблема в том, что в ДМПА конечное состояние может быть дости-
жимо только при определенном состоянии стека. На графе для этого прихо-
дится вводить новые искусственные состояния. Например, на рис. 2.8 изоб-
ражена ситуация, когда состояние q' является конечным лишь в том случае,
если на вершине стека находится символ Z'.
q |
q'' |
(a, Z, ) (e, Z', Z')
q'
Рисунок 2.8 – Переход в конечное состояние ДМПА
Дополнительно примем соглашение, что если Z = , то это соответ-
ствует требованию пустоты стека.
В таблице переходов ДМПА каждому состоянию соответствует от-
дельная строка таблицы, а каждой допустимой комбинации (a, Z), a Σ{e} { }, Z Γ, – отдельный столбец (см. табл. 2.5). Комбинации (a, Z)
должны быть такими, что в любой конфигурации ДМПА существует только один вариант перехода в новое состояние. Ячейки таблицы δ(q, a, Z) могут принимать следующие варианты значений:
37
–Пара (q', ), соответствующая переходу в состояние q' и запись це-
почки на вершину стека;
–Элемент HALT, соответствующий успешному завершению разбора,
т.е. ситуации, когда a = , q F (на графе отображается как окруж-
ность с двойной границей);
–Элемент ERROR, соответствующий синтаксической ошибке (на графе это ситуация, когда отсутствует дуга из состояния q в состояние q' с меткой (a, Z, )).
Таблица 2.5 – Таблица переходов ДМПА
|
(a1, Z1) |
(a2, Z2) |
(a3, Z3) |
… |
|
|
|
|
|
q0 |
δ(q0, a1, Z1) |
δ(q0, a2, Z2) |
δ(q0, a3, Z3) |
… |
|
|
|
|
|
q1 |
δ(q1, a1, Z1) |
δ(q1, a2, Z2) |
δ(q1, a3, Z3) |
… |
|
|
|
|
|
q2 |
δ(q2, a1, Z1) |
δ(q2, a2, Z2) |
δ(q2, a3, Z3) |
… |
|
|
|
|
|
… |
… |
… |
… |
… |
|
|
|
|
|
Так, графу на рис. 2.8 будет соответствовать таблица переходов вида
табл. 2.6.
Таблица 2.6 – Таблица переходов ДМПА с конечным состоянием
|
(a, Z) |
(e, Z') |
( , Z') |
|
|
|
|
q |
(q', ) |
ERROR |
ERROR |
|
|
|
|
q' |
ERROR |
(q'', Z') |
ERROR |
|
|
|
|
q'' |
ERROR |
ERROR |
HALT |
|
|
|
|
Однако, с использованием таблицы переходов, можно обойтись без но-
вых искусственных состояний, чтобы показать достижимость конечного со-
стояния ДМПА (табл. 2.7).
Таблица 2.7 – Упрощенная таблица переходов ДМПА с конечным состоянием
|
(a, Z) |
( , Z') |
|
|
|
38
q |
(q', ) |
ERROR |
|
|
|
q' |
ERROR |
HALT |
|
|
|
В принципе, оба варианта таблицы допустимы. В дальнейшем для про-
стоты вместо записи элемента ERROR будем оставлять ячейки таблиц пу-
стыми.
В таблице переходов ДКА каждому состоянию соответствует отдель-
ная строка таблицы, а каждому допустимому входному символу a Σ{ } –
отдельный столбец (см. табл. 2.8). Ячейки таблицы δ(q, a) могут принимать следующие варианты значений:
–Элемент q', соответствующий переходу в состояние q';
–Элемент HALT, соответствующий успешному завершению разбора,
т.е. ситуации, когда a = , q F (на графе отображается как окруж-
ность с двойной границей);
–Элемент ERROR, соответствующий синтаксической ошибке (на графе это ситуация, когда отсутствует дуга из состояния q в состоя-
ние q' с меткой a).
Таблица 2.8 – Таблица переходов ДКА
|
a1 |
a2 |
… |
|
|
|
|
|
|
q0 |
δ(q0, a1) |
δ(q0, a2) |
… |
δ(q0, ) |
|
|
|
|
|
q1 |
δ(q1, a1) |
δ(q1, a2) |
… |
δ(q1, ) |
|
|
|
|
|
q2 |
δ(q2, a1) |
δ(q2, a2) |
… |
δ(q2, ) |
|
|
|
|
|
… |
… |
… |
… |
… |
|
|
|
|
|
В общем случае, построение графа или таблицы переходов конечного автомата – задача неформализованная, и предполагает некоторый творческий подход. Можно лишь дать некоторые рекомендации:
1.Проще всего сначала построить граф переходов, а потом по описан-
ным выше правилам преобразовать его в таблицу переходов.