- •4. Эквивалентные преобразования кс- и а-грамматик
- •4.1. Декомпозиция правил грамматики
- •4.2. Исключение тупиков
- •4.3. Обобщенные кс-грамматики и приведение их к удлиняющей
- •4.4. Устранение левой рекурсии и левая факторизация
- •5. Свойства автоматных и контекстно-свободных
- •5.1. Общий вид цепочек а-языков
- •5.2. Общий вид цепочек кс-языков
- •5.3. Операции над языками
- •5.3.1. Операции над кс-языками
- •5.3.2. Операции над а-языками
- •5.3.3. Выводы для практики
- •5.4. Неоднозначность кс-грамматик и языков
- •6. Автоматы и преобразователи с магазинной
- •6.1. Основные определения
- •6. 2. Эквивалентность мп-автоматов и кс-грамматик
- •6. 3. Детерминированные мп-автоматы и кс-языки
- •6. 4. Преобразователи с магазинной памятью
- •6. 5. Моделирование мп-преобразователей
6. 2. Эквивалентность мп-автоматов и кс-грамматик
Теперь можно показать, что языки, определяемые МП-автоматами - это в точности КС-языки. Начнем с построения естественного (недетерминированного) “нисходящего” распознавателя, эквивалентного данной КС-грамматике.
Теорема 6.2. Пусть G=(, , P, S) - КС-грамматика. По грамматике G можно построить такой МП-автомат R, что L(R)=L(G).
Доказательство. Построим R так, чтобы он моделировал все левые выводы в грамматике G.
Пусть R=({q}, , , , q, S, ), где определяется следующим образом:
(1) если A принадлежит P, то (q, , A) содержит (q, );
(2) (q, a, a) = {(q, ) для всех a .
Необходимо показать, что
A m
тогда и только тогда, когда
(q, , A) n (q, , )
для некоторых m, n 1.
Необходимость условия доказывается индукцией по m. Допустим, что A m . Если m=1 и = a1 ... ak (k 0), то
(q, a1 ... ak , A) (q, a1 ... ak , a1 ... ak )
k (q, , )
Теперь предположим, что A m для некоторого m>1. Первый шаг этого вывода должен иметь вид A X1 X2 ... Xk , где для некоторого m i < m, 1 i k, и x1 x2 ...xk = . Тогда
(q, , A) (q, , X1 X2 ... Xk )
Если Xi , то по предположению индукции
(q, xi , Xi ) (q, , )
Если Xi , то
(q, xi , Xi ) (q, , )
Объединяя все эти последовательности тактов, видим, что
(q, , A) + (q, , ).
Для доказательства достаточности покажем индукцией по n, что если
(q, , A) n (q, , ),
то
A + .
Если n=1, то = и A принадлежит P. Предположим, что утверждение верно для всех n< n. Тогда первый такт, сделанный МП-автоматом R, должен иметь вид
(q, , A) (q, , X1 ... Xk )
причем (q, xi , Xi ) (q, , ) для 1 i k и = x1 x2 ... xk . Тогда A X1 ... Xk - правило из P, и по предположению индукции Xi + xi для Xi . Если Xi , то Xi 0 xi. Таким образом
A X1 ... Xk
x1 X2 ... Xk
........................
x1 x2 ... xk-1 Xk
x1 x2 ... xk-1 xk =
- вывод цепочки из A в грамматике G.
Пример 6.4. Построим МП-автомат R, для которого L(R) = L(G0 ), где G0 - грамматика, определяющая арифметические выражения с правилами
E E+TT
T TFF
F (E)a
Пусть R = ({q}, , , , q, E, ), где определяется так:
(1) (q, , E) = {(q, E+T), (q, T)};
(2) (q, , T) = {(q, TF), (q, F)};
(3) (q, , F) = {(q, (E)), (q, a)};
(4) (q, b, b) = {(q, )} для всех b {a, +, , (, )}.
При выводе a+aa для R возможна среди других следующая последовательность тактов:
(q, a+aa, E) (q, a+aa, E+T)
(q, a+aa, T+T)
(q, a+aa, F+T)
(q, a+aa, a+T)
(q, +aa, +T)
(q, aa, T)
(q, aa, TF)
(q, aa, FF)
(q, aa, aF)
(q, a, F)
(q, a, F)
(q, a, a)
(q, , )
Заметим, что вычисление МП-автомата R соответствует левому выводу цепочки a+aa из E в грамматике G0 .
Тип синтаксического анализа, проводимого МП-автоматом, построенным в теореме 6.2, называется “нисходящим анализом” (“анализом сверху вниз”) или “предсказывающим анализом”, потому что при этом дерево вывода строится по существу сверху (от корня) вниз, а каждый такт вида (1) можно трактовать как предсказание очередного шага левого вывода. Подробно нисходящий синтаксический анализ и его алгоритмы, как часть компилятора, будут рассмотрены во второй части пособия.
Можно построить расширенный МП-автомат, который работает “снизу вверх” как “восходящий анализатор”, моделируя в обратном порядке правые выводы в КС-грамматике. Рассмотрим цепочку a+aa L(G0 ) из примера 6.4 и ее правый вывод из E в грамматике G0 :
E E+T E+TF E+Ta E+Fa
E+aa T+aa F+aa a+aa
Предположим, что мы записываем этот вывод в обратном порядке. Если считать, что переход от цепочки a+aa к цепочке F+aa происходит по правилу F a, примененному “в обратном направлении”, то можно сказать, что цепочка a+aa “свертывается (редуцируется) слева” к цепочке F+aa. Более того, это единственно возможная левая свертка. Подобным же образом можно правовыводимую цепочку F+aa свернуть слева к цепочке T+aa с помощью правила T F и т.д. Определим формально левую свертку.
Пусть G=(, , P, S) - КС-грамматика и
S A
- правый вывод в ней. Говорят, что правовыводимую цепочку можно свернуть слева (редуцировать) к правовыводимой цепочке A с помощью правила A . Указанное вхождение цепочки в цепочку называется основой цепочки .
Таким образом, основа правовыводимой цепочки - это ее любая подцепочка, которая является правой частью некоторого правила, причем после замены ее левой частью этого правила тоже получится правовыводимая цепочка.
Основу правовыводимой цепочки можно было определить другим способом в терминах деревьев вывода.
Основа - это крона самого левого поддерева глубины 1 некоторого дерева вывода заданной правовыводимой цепочки.
Дерево глубины 1, состоящее из вершины и ее прямых потомков, которые являются листьями, называется кустом или веером.
Дерево вывода цепочки a+aa в грамматике G0 показано на рис 6.2 (а). Самый левый куст состоит из самой левой вершины, помеченной F, которая является его корнем, и кроны a.
Если удалить единственный лист самого левого куста, то останется дерево, показанное на рис. 6.2 (б). Крона F+aa этого дерева и есть результат левой свертки цепочки a+aa, а его основа - крона F поддерева с корнем, помеченным T. Опять удалив основу, получим дерево на рис 6.2 (в).
Описанный процесс свертки деревьев называется отсечением основ.
По КС-грамматике G можно построить эквивалентный расширенный МП-автомат R, работа которого заключается в отсечении основ. Здесь удобно представлять себе магазин в виде цепочки, верхним символом которой является самый правый, а не самый левый символ. В силу этого, отношение перехода в этом автомате будет определятся несколько иначе. Если (q, a, ) содержит (p, ), то будем писать
(q, a , ) (p, , )
для всех и .
В дальнейшем, если не оговорено противное, будем считать, что у обычного МП-автомата (нисходящего анализатора) верх магазина расположен слева, а у расширенного (восходящего анализатора) - справа.
Теорема 6.3. Пусть G=(, , P, S) - КС-грамматика. По G можно построить такой расширенный МП-автомат R, что L(R) = L(G).
Эта теорема является следствием теорем 6.1 и 6.2, но здесь интересна сама конструкция расширенного МП-автомата R, который и моделирует процесс отсечения основ. Итак
R = ({q, r}, , {$}, , q, $, {r})
- расширенный МП автомат, где по соглашению верх магазина расположен справа, и, в котором определяется следующим образом:
(1) (q, a, ) = {(q, a)} для всех a . (На этих тактах входные символы переносятся в магазин.)
(2) Если A принадлежит P, то (q, , ) содержит (q, A). (В случае, когда в верхней части магазина окажется правая часть некоторой продукции эта правая часть может быть заменена левой частью соответствующего правила без движения по входной ленте.)
(3) (q, , $S) = {(r, )}. (Если вся входная цепочка прочитана и в вершине магазина только начальный символ грамматики, автомат переходит в заключительную конфигурацию.)
Можно показать, что процесс вычисления в автомате R заключается в построении правовыводимых цепочек грамматики G, начиная с терминальной цепочки (на входе R) и кончая цепочкой S.
Пример 6.5. Построим “восходящий” расширенный автомат R для грамматики арифметических выражений G0 . Пусть R = ({q, r}, , , , q, $, {r}), где определяется так:
(1) (q, b, ) = {(q, b)} для всех b {a, +, , (, )};
(2) (q, , E+T) = {(q, E)}
(q, , T) = {(q, E)}
(q, , TF) = {(q, T)}
(q, , F) = {(q, T)}
(q, , (E)) = {(q, F)}
(q, , a) = {(q, F)};
(3) (q, , $E) = {(r, )}.
Для входа a+aa распознаватель может сделать следующую последовательность тактов:
(q, a+aa, $) (q, +aa, $a)
(q, +aa, $F)
(q, +aa, $T)
(q, +aa, $E)
(q, aa, $E+)
(q, a, $E+a)
(q, a, $E+F)
(q, a, $E+T)
(q, a, $E+T)
(q, , $E+Ta)
(q, , $E+TF)
(q, , $E+T)
(q, , $E)
(r, , )
Заметим, что для входа a+aa распознаватель R может сделать много различных последовательностей тактов. Однако представленная последовательность - единственная, которая переводит начальную конфигурацию в заключительную.
Покажем теперь, что язык, определяемый МП-автоматом, контекстно-свободен.
Теорема 6.4. Пусть R = (Q, , , , q0 , Z0 , F) - МП-автомат. Можно построить такую КС-грамматику G, что L(G) = L(R).
Доказательство. Построим G так, чтобы левый вывод цепочки в грамматике G прямо соответствовал последовательности тактов, которую делает R при обработке цепочки . Нетерминальные символы будут иметь вид < qZr>, где q, r Q и Z .
Формально пусть G = ( , , P, S), где
(1) = {< qZr> q, r Q, Z } {S};
(2) правила множества P строятся так:
(а) если (q, a, Z) содержит (r, X1 ... Xk) (k 0), добавим к P все правила вида
< qZsk > a< rX1 s1 ><s1 X2 s2 > ... <sk-1 Xk sk >
для каждой последовательности s1 , s2 , ... , sk состояний из Q,
(б) если (q, a, Z) содержит (r, ), добавим к P правило < qZr > a,
(в) добавим к P правила S < q0 Z0 q > для каждого q Q.
Индукцией по m и n можно доказать, что для любых q, r Q Z
< qZr> m тогда и только тогда, когда (q, , Z) n (r, , ).
Из этого утверждения следует, что
S < q0 Z0 q > +
тогда и только тогда, когда
(q0 , , Z0 ) + (r, , )
для q Q. Таким образом L(R) = L(G).
Результаты данного раздела можно сформулировать в виде следующей теоремы:
Теорема 6.5. Утверждения
(1) L = L(G) для КС-грамматики G,
(2) L = L(R1) для МП-автомата R1,
(3) L = L(R2) для расширенного МП-автомата R2.
эквивалентны.
Доказательство. Из (2) следует (1) по теореме 6.4. Из (1) следует (2) по теореме 6.2. Из (3) следует (2) по теореме 6.1, а (3) тривиально следует из (2).