
- •Формальные грамматики и языки.
- •Задача разбора
- •Классификация грамматик по Холмскому.
- •Диаграмма состояний
- •Отношения предшествования
- •Распознаватель
- •Матрица предшествования
- •Некоторые приемы приведения к грамматикам простого предшествования.
- •Представление автоматов.
- •Концевые маркеры и выходы из распознавания.
- •Эквивалентность состояний.
- •Проверка эквивалентности двух состояний.
- •Недостижимые состояния.
- •Алгоритм составления списка достижимых состояний.
- •Приведённые автоматы.
- •Получение минимального автомата.
- •Недетерминированные автоматы.
- •Эквивалентность недетерминированных и детерминированных конечных распознавателей (нкр и дкр).
- •Задание:
- •Транслятор.
- •Введение таблицы символов.
- •Включение неявной информации.
- •Обнаружение ошибок.
- •Макрообработка и операции, выполняемые во время компиляции.
- •Синтез объектной программы.
- •Оптимизация.
- •Генерация кода.
- •Редактирование связей и загрузки.
- •Задача идентификации. Реализация ка при работе трансляторов.
- •Хранение информации о лексемах.
- •Механизм запоминания.
- •Метод хеширования.
- •Нисходящий разбор с возвратами.
- •Начальная установка.
- •Новый человек.
- •Неудача
- •Класс грамматик, допускающих нисходящий распознаватель.
- •Статистические управляемые схемы перевода и атрибутные грамматики.
- •Контекстные условия
Эквивалентность недетерминированных и детерминированных конечных распознавателей (нкр и дкр).
Понятие недетерминированного конечного распознавателя (НКР) приобретает практическое значение благодаря следующему факту: Для каждого НКР СУЩЕСТВУЕТ ДКР, который допускает в точности те же входные цепочки, что и недетерминированный.
Рассмотрим, как можно найти эквивалентный детерминированный автомат.
Основная идея построения заключается в том, что после обработки отдельной входной цепочки состояния детерминированного автомата будет представлять собой множество всех состояний недетерминированного автомата, которые он может достичь из начальных состояний после применения данной цепочки. Переходы ДА можно получить из переходов НДА, вычисляя множество состояний, которые могут следовать после данного множества при различных входных символах. Допустимость цепочки определяется по тому, является ли последнее детерминированное состояние, которого он достиг, множеством недетерминированных состояний, включающим хотя бы одно допускающее состояние. Результирующий ДА является конечным, т.к. существует лишь конечное число подмножеств недетерминированных состояний.
Если НДА имеет n состояний, то эквивалентный ему ДА должен иметь 2n состояний – по числу подмножеств. На практике многие из этих подмножеств представляют собой недостижимые состояния.
Будем строить переходы только для тех подмножеств, которые действительно необходимы.
Пусть МН – НДА, а МД – эквивалентный ему ДА, который нужно построить.
Пометить первую строку таблицы переходов для МД множеством начальных состояний автомата МН. Применить к этому множеству шаг 2.
По данному множеству состояний S, помечающему строку таблицу переходов автомата МД, для которой переходы ещё не вычислены, вычислить те состояния МН, которые могут быть достигнуты из S с помощью каждого входного символа Х, и поместить множества последующих состояний в соответствующие ячейки таблицы МД. Символически это выражается так. Если δ – функция недетерминированных переходов, то функция детерминированных переходов δ' задаётся формулой:
δ'(S, x)= {S|(s принадлежит δ (x, t) для некоторого t из S}.
Для каждого нового множества, порождённого переходами на шаге 2, посмотреть, имеется ли уже в МД строка, помеченная этим множеством. Если нет, то создать новую строку и пометить её этим множеством. Если множество уже использовалось как метка, то никаких действий не требуется.
Если в таблице автомата МД есть строка, для которой ещё не вычислены переходы, вернуться назад и применить к этой строке шаг 2. Если все переходы вычислены, перейти к шагу 5.
Пометить строку как допускающее состояние автомата МД , когда она содержит допускающее состояние недетерминированного автомата (НДА). В противном случае - как отвергающее состояние.
Рассмотрим эту процедуру на примере следующего НДА.
-
0
1
→А
→B
С
А,В
В
С
С
С,А
С
С
С, А
После шага 1получаем:
|
0 1 |
{A, B} |
|
Применяя шаг 2 к {А, В} обнаруживаем
δ'({А, В}, 0)= {А, В} и δ' ({А, В}, 1)= {С}
|
0 |
1 |
{A, B}
|
{A, B} {C} |
|
Применяя шаг 3, мы видим, что уже имеется строка {А, В}, но не для {С}.
|
0 |
1 |
{A, B} {C} |
{A, B} |
{C} |
Переходя к шагу 4, обнаруживаем, что нужно применить шаг 2 к {С}. На шаге 3 выясняется, что нужны ещё 2 строки.
|
0 |
1 |
{A, B} {C} {} {A, C} |
{A, B} {} |
{C} {A,C} |
Применение шага 2 для {A, C} и {} дает нам переходы во множества, которые уже являются именами состояний.
|
0 |
1 |
{A, B} {C} {} {A, C} |
{A, B} {} {} {A, B} |
{C} {A,C} {} {A,C} |
Теперь шаг 4 предписываем нам перейти к шагу 5 и отметить состояние {А, В} как допускающее, т.к. содержит допускающее состояние В; состояние {С} и {А, С} отмечаются как допускающие, т.к. содержат допускающее состояние С. { } не содержит допускающих состояний, и поэтому помечаются как отвергающее.
|
0 |
1 |
|
→{A, B} {C} {} {A, C} |
{A, B} {} {} {A, B} |
{C} {A,C} {} {A,C} |
1 1 0 1 |
Изобразим окончательный вариант ДА ~НДА исходному в более простых обозначениях
-
0
1
1
2
3
4
1
3
3
1
2
4
3
4
1
1
0
1
В качестве ещё одного примера применим процедуру к автомату.
|
Н |
С |
Л |
О |
А |
Ь |
|
С0 Л1 А1 С1 С2 0 Л2 А2 Н Ь |
Н |
С1 С2
|
Л1Л2
|
О
|
А1
А2
|
Ь
|
0 0 0 0 0 1 0 0 0 1 |
Получим:
|
Н |
С |
Л |
О |
А |
Ь |
|
{С0} {Л1,Л2} {А1, А2} {С1} {С2} {0} {Н} {Ь} {} |
{Н}
|
{С1} {С2}
|
{Л1Л2}
|
{О}
|
{А1, А2}
|
{Ь}
|
0 0 0 0 0 1 0 1 0 |
Так как большинство переходов приводимых пустому множеству, мы обозначаем это состояние пусто, чтобы не загромождать автомат.
Состояние, соответствующее пустому множеству, является ошибочным, это отвергающее состояние, которое переходит само в себя для всех входом и имеет место только тогда, когда для данной входной цепочки нет допустимых продолжений.
Теоретически НДА с 10-ю состояниями, может иметь детерминированный вариант с 1024 состояниями: в соответствии с числом подмножеств множества содержащего 10 состояний. Но на самом деле потребовалось только 9 состояний. Это меньше исходного числа. Можно заметить, что не нужно делать различия между ролями Л1 и Л2, а также А1 и А2. Алгоритм позволяет нам не заботиться об этом при создании исходного распознавателя. Хотя процедура гарантирует, что детерминированный автомат не содержит недостижимых состояний, ДА может оказаться не минимальным. В последнем примере состояния { 0 } и { 6 } явно эквивалентны и могут быть объединены.