Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория формальных грамматик 2ч.doc
Скачиваний:
35
Добавлен:
04.11.2018
Размер:
596.99 Кб
Скачать

6. 5. Моделирование мп-преобразователей

Большинство МП-преобразователей, рассмотренных в предыдущем разделе, были в общем случае недетерминированными. Во второй части пособия, посвященной построению компиляторов, будут рассмотрены детерминированные левые и правые анализаторы. Там же будут изложены строгие недетерминированные алгоритмы нисходящего и восходящего разбора. Остановимся здесь лишь на основных моментах моделирования недетерминированных МП-автоматов и преобразователей.

Рассмотрим недетерминированный МП-преобразователь P и лежащий в его основе МП-автомат M. Допустим, что все последовательности тактов, которые может сделать P для входной цепочки ограничены по длине. Тогда общее число различных последовательностей тактов МП-преобразователя P тоже конечно, хотя, возможно, и экспоненциально зависит от длины цепочки . Прямой способ детерминированного моделирования P состоит в том, чтобы каким-то образом линейно упорядочить последовательности тактов и затем в предписанном порядке промоделировать каждую последовательность.

Если необходимо получить все выходные цепочки для данной входной цепочки , то моделируются все последовательности тактов. Если можно обойтись одной выходной цепочкой, то, обнаружив первую последовательность тактов, оканчивающуюся заключительной конфигурацией, можно прекратить моделирование P. Разумеется, если ни одна последовательность не заканчивается заключительной конфигурацией, прийдется перепробовать все.

Последовательности тактов располагают обычно в таком порядке, чтобы к моделированию очередной последовательности можно было перейти, возвратившись по последним сделанным тактам (т. е. прослеживая их) к конфигурации, в которой возможен еще не испытанный альтернативный такт. Этот такт и надо затем промоделировать. Не случайно алгоритмы в основе которых лежит рассмотренная схема, носят название алгоритмов синтаксического анализа с возвратами.

Основное требование этих алгоритмов - ограниченность по длине каждой из последовательностей тактов. Если для входа возможны бесконечные последовательности тактов, то очевидно, что прямое моделирование преобразователя P невозможно. Интуитивно ясно, а в дальнейшем будет показано, что левый анализатор не зацикливается тогда и только тогда, когда грамматика, лежащая в его основе не леворекурсивна. Правый анализатор не зацикливается, когда соответствующая грамматика не содержит циклов и -правил. Все перечисленные условия не очень ограничительны, так как всегда можно построить эквивалентную КС-грамматику, удовлетворяющую этим условиям.

Для того чтобы продемонстрировать, что такое анализ с возвратами и вообще моделирование недетерминированного преобразователя, рассмотрим пример.

Пример 6.11. Рассмотрим грамматику G с правилами

(1) S aSbS

(2) S aS

(3) S c

Левым анализатором для G служит преобразователь T со следующей функцией переходов:

(q, a, S) = {(q, SbS, 1), (q, S, 2)}

(q, c, S) = {(q, , 3)}

(q, b, b) = {(q, , )}

Допустим, что нам необходимо разобрать входную цепочку aacbc. На рис. 6.3 изображено дерево, представляющее возможные последовательности тактов, которые может сделать T для этого входа.

Вершина C0 представляет начальную конфигурацию (q, aacbc, S, ). Правила, определяющие T показывают, что из C0 можно перейти в две следующие конфигурации, а именно С1 = (q, acbc, SbS, 1) и C2 = (q, acbc, S, 2). (Упорядочение здесь произвольное.) Из C1 анализатор T может перейти в конфигурации C3 = (q, cbc, SbSbS, 11) и C4 = (q, cbc, SbS, 12). Из C2 можно перейти в конфигурации C11 = (q, cbc, SbS, 21) и C15 = (q, cbc, S, 22). Остальные конфигурации определяются однозначно.

Посмотрим теперь, как можно определить все допускающие конфигурации анализатора T, систематически прослеживая все возможные для T последовательности тактов. Допустим, что из C0, делая первый выбор, мы получаем C1. Из C1, снова делая первый выбор, получаем C3. Продолжая в том же духе, мы прослеживаем последовательность конфигураций C0, C1, C3, C5, C6, C7. Вершина C7 представляет заключительную конфигурацию (q, , bS, 1133), которая не является допускающей. Чтобы определить, существует ли другая заключительная конфигурация, можно вернуться (сделать “возврат”) по дереву, пока не встретится конфигурация, для которой возможен другой, еще не рассмотренный выбор очередного такта. Поэтому мы должны быть в состоянии восстановить конфигурацию C6 по конфигурации C7. Возврат к C6 из C7 может включать обратный сдвиг головки на входе, восстановление предыдущего содержимого магазина и удаление выходных символов, выданных при переходе от C6 к C7. Восстановив С6, мы должны сделать новый выбор очередного такта (если он возможен). Так как в C6 других альтернатив нет, мы продолжаем возврат к C5 и далее к C3 и C1. Из C1 с помощью второго выбора такта для правила (q, a, S) можно получить конфигурацию C4, а затем переходя через С8 и С9, можно получить конфигурацию С10 = (q, , , 1233), которая оказывается допускающей. После этого можно выдать в качестве выхода левый разбор 1233 и завершить моделирование. Но если нас интересуют все разборы, можно вернуться к конфигурации С0 и испробовать все конфигурации, достижимые из C2. Вершина C14 = (q, , , 2133) представляет другую допускающую конфигурацию.

Если входная цепочка построена синтаксически неверно, то необходимо рассмотреть все возможные последовательности тактов и если все они исчерпаны, а допускающая конфигурация не обнаружена, надо выдать сообщение об ошибке. 

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

Упражнения

6.1. Найдите восходящие и нисходящие МП-автоматы для следующих грамматик:

(а)

S aSb

(б)

S ASb

A SAa

(в)

S SSA

A 0A1S01

6.2. Найдите грамматику, порождающую L(R), где

R = ({q0, q1, q2}, {a, b}, {Z0, A}, , q0, Z0, {q2})

и определяется равенствами

(q0, a, Z0) = (q1, AZ0)

(q0, a, A) = (q1, AA)

(q1, a, A) = (q0, AA)

(q1, , A) = (q2, A)

(q2, b, A) = (q2, )

Для тупиковых нетерминалов строить правила не обязательно.

6.3. Постройте ДМП-автоматы, допускающие следующие языки:

(а) {0 n 1m m n},

(б) { состоит из равного числа символов a и b,

(в) L(G0), где G0 - обычная грамматика простых арифметических выражений.

6.4. Покажите последовательности конфигураций МП-преобразователей из примеров 6.9, 6.10, которые они проходят допуская цепочку (a+a)a.

ЗАКЛЮЧЕНИЕ

Завершая пособие, отметим, что очень многие аспекты теории формальных языков остались за пределами предлагаемого материала. Это лишь введение в математическую лингвистику и основы вычислимости. Будем считать это первым знакомством с данной теорией и автор считал бы свою задачу выполненной, если хотя бы часть из Вас заинтересовалась ею и захотела просмотреть одну из монографий, предложенных в списке литературы.

Та часть теории формальных языков, которая изложена в пособии, имеет ярко выраженную практическую направленность. Рассмотренные вопросы позволят вам глубже понять и осмыслить алгоритмы, лежащие в основе синтаксического анализа и компиляции, которые автор предполагает осветить во второй части пособия - “Основы построения компиляторов”. Поэтому здесь мы не ставим точку

82