Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы построения трансляторов(лекции).doc
Скачиваний:
1
Добавлен:
02.01.2020
Размер:
2.79 Mб
Скачать

3.4. Недетерминированный разбор

При выполнении разбора по регулярной грамматике может оказаться, что несколько разных нетерминалов имеют правила вывода с одинаковыми правыми частями, и поэтому неясно, к какому из них делать свертку (см. п.3.3). В терминах диаграммы состояний это означает, что из одного состояния выходит несколько дуг, ведущих в разные состояния, но помеченных одним и тем же символом. Такой грамматике будет соответствовать недетерминированный конечный автомат.

Недетерминированный конечный автомат (НКА) – это пятерка

(K, V, F, H, S), где

K - конечное множество состояний;

V - конечное множество допустимых входных символов;

F - отображение множества K  V в множество подмножеств K;

H  K - конечное множество начальных состояний;

S  K - конечное множество заключительных состояний.

F(A,t) = {B1,B2,...,Bn} означает, что из состояния A по входному символу t можно осуществить переход в любое из состояний Bi, i = 1, 2, ... ,n.

Таким образом, недетерминизм автомата заключается в следующем:

  1. находясь в некотором состоянии и обозревая текущий символ, автомат может перейти в общем случае в одно из нескольких возможных состояний;

  2. автомат может делать переходы по ε .

Пример 3.4

Для грамматики G = ({a,b, }, {S,A,B}, P, S), где

P={ S  A, A  a | Bb, B  b | Bb}

разбор будет недетерминированным (так как у нетерминалов A и B есть одинаковые правые части Bb). Данной грамматике будет соответствовать полностью определенный недетерминированный конечный автомат, граф переходов которого представлен на рис. 3.9. : M = ({H, A, B, ER, S}, {a, b, }, F, H, {S}), где

F: F(H, a)=A, F(H, b)=B, F(H, )=ER, F(A, )=S, F(A, a)=ER, F(A, b)=ER, F(B, b)={A, B},F(B, a)=ER, F(B, )=ER, F(ER, a)=ER, F(ER, b)=ER,

F(ER, )=ER.

Рис. 3.9. Граф переходов полностью определенного

недетерминированного конечного автомата

В случае недетерминированного разбора входной цепочки символов можно предложить алгоритм, который будет перебирать все возможные варианты сверток (переходов) один за другим; если цепочка принадлежит языку, то будет найден путь, ведущий к успеху; если будут просмотрены все варианты, и каждый из них будет завершаться неудачей, то цепочка языку не принадлежит. Однако такой алгоритм практически неприемлем, поскольку при переборе вариантов мы, скорее всего, снова окажемся перед проблемой выбора и, следовательно, будем иметь "дерево отложенных вариантов".

Важным частным случаем недетерминированного конечного автомата является детерминированный конечный автомат (ДКА), который на каждом такте работы имеет возможность перейти не более чем в одно состояние, а также не может делать переходы по ε.

Один из наиболее важных результатов теории конечных автоматов состоит в том, что класс языков, определяемых недетерминированными конечными автоматами, совпадает с классом языков, определяемых детерминированными конечными автоматами.

Это означает, что для любого НКА всегда можно построить детерминированный КА, определяющий тот же язык. Моделировать работу ДКА значительно проще, чем работу произвольного конечного автомата, поэтому при построении компиляторов используемый произвольный КА обычно стремятся преобразовать в ДКА.

Алгоритм построения ДКА по НКА.

Вход: M = (K, V, F, H, S) - недетерминированный конечный автомат.

Выход: M’ = (K’, V, F’, H’, S’) - детерминированный конечный автомат, допускающий тот же язык, что и автомат М.

Метод:

  1. Множество состояний К’ автомата М’ состоит из всех подмножеств множества К автомата М. Каждое состояние из К’ будем обозначать [A1A2...An], где Ai K.

  2. Функция переходов F’ автомата М’ строится следующим образом: F’ ([A1A2...An], t) = [B1B2...Bm], где для любого 1  i  n существует 1  j  m так, что F(Ai, t) = Bj .

  3. Пусть H = {H1, H2, ..., Hk}, тогда H’ = [H1, H2, ..., Hk].

  4. Пусть S = {S1, S2, ..., Sp}, тогда S’ - все состояния из K’, имеющие вид [...Si...], Si  S для какого-либо 1  i  p.

После построения из нового ДКА необходимо удалить все недостижимые состояния.

Состояние kK в конечном автомате M = (K, V, F, H, S) называется недостижимым, если ни при какой входной цепочке wV+ невозможен переход автомата из начального состояния Н в состояние k. Иначе состояние называется достижимым.

Алгоритм удаления недостижимых состояний.

Пусть R – множество достижимых состояний; Рi – множество текущих активных состояний автомата M = (K, V, F, H, S) на i-м шаге алгоритма. Результатом работы алгоритма является полное множество достижимых состояний R.

1.

2.

3.

4. Если , то выполнение алгоритма закончено, иначе

. Перейти к шагу 3.

Рассмотрим пример, иллюстрирующий работу алгоритма преобразования недетерминированного КА в ДКА.

Пример 3.4

Пусть дан конечный автомат M = ({H, A, B, S}, {0, 1}, F, {H}, {S}), где F: F(H, 1) = B, F(B, 0) = A, F(A, 1) = B, F(A, 1) = S .

Граф переходов данного автомата выглядит следующим образом (рис. 3.10):

Рис. 3.10. Граф переходов недетерминированного КА

Очевидно, что заданный конечный автомат является недетерминированным, так как из состояния А по символу ‘1’ возможен переход как в состояние В, так и в состояние S. Преобразуем заданный НКА в детерминированный КА.

Множество состояний эквивалентного ДКА будет следующим:

K’ = {[H], [A], [B], [S], [HA], [HB], [HS], [AB], [AS], [BS], [HAB], [HAS], [ABS], [HBS], [HABS]}

Построим функцию переходов эквивалентного ДКА:

F’([A], 1) = [BS] F’([H], 1) = [B]

F’([B], 0) = [A] F’([HA], 1) = [BS]

F’([HB], 1) = [B] F’([HB], 0) = [A]

F’([HS], 1) = [B] F’([AB], 1) = [BS]

F’([AB], 0) = [A] F’([AS], 1) = [BS]

F’([BS], 0) = [A] F’([HAB], 0) = [A]

F’([HAB], 1) = [BS] F’([HAS], 1) = [BS]

F’([ABS], 1) = [BS] F’([ABS], 0) = [A]

F’([HBS], 1) = [B] F’([HBS], 0) = [A]

F’([HABS], 1) = [BS] F’([HABS], 0) = [A]

Начальное состояние эквивалентного ДКА:

S’ = {[S], [HS], [AS], [BS], [HAS], [ABS], [HBS], [HABS]}

Применим алгоритм удаления недостижимых состояний.

Множество достижимых состояний ДКА: R={[H], [B], [A] и [BS]}, поэтому все остальные состояния удаляются.

Таким образом, M’ = ({[H], [B], [A], [BS]}, {0, 1}, F’, H, {[BS]}), где

F’([A], 1) = [BS] F’([H], 1) = [B]

F’([B], 0) = [A] F’([BS], 0) = [A]

Обозначим состояние BS как S, тогда

M’ = ({[H], [B], [A], [S]}, {0, 1}, F’, H, {[S]}), где

F’([A], 1) = [S] F’([H], 1) = [B]

F’([B], 0) = [A] F’([S], 0) = [A]

Граф переходов полученного ДКА изображен на рис. 3.11.

Рис. 3.11. Граф переходов детерминированного КА

Э тот автомат легко преобразовать к полностью определенному виду (рис. 3.12):

Рис. 3.12. Граф переходов полностью определенного детерминированного КА

В процессе построения распознавателей при решении вопроса о необходимости преобразования НКА в ДКА следует руководствоваться принципом разумной достаточности, так как при выполнении преобразований число состояний автомата может значительно возрасти, что, в свою очередь, влечет за собой увеличение затрат на моделирование. Поэтому не всегда выполнение преобразования автомата к детерминированному виду является обязательным.