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

Магазинный автомат или автомат с магазинной памятью (МП - автомат) - это семерка
 ,
где
,
где 
Q - конечное множество состояний;
T - конечный входной алфавит;
M - конечный алфавит магазинных символов (стековый алфавит);
 - начальное состояние автомата;
- начальное состояние автомата;
 - начальный символ магазина;
- начальный символ магазина;
 - конечное множество заключительных
состояний;
- конечное множество заключительных
состояний;
t - функция переходов

отображает тройки, образованные
состоянием, текущим входным символом
на входной ленте или пустым символом 
и вершиной магазина в множество
всех подмножеств 
 .
В начале работы на входной ленте записано
исходное предложение, ограниченное с
двух сторон концевыми маркерами,
считывающая головка установлена на
первый символ предложения, магазин пуст
и содержит начальный символ магазина,
магазинный автомат находится в начальном
состоянии. В процессе функционирования
строка на входной ленте просматривается
слева направо без возвратов. На каждом
шаге автомат переходит из одной
конфигурации в следующую.
.
В начале работы на входной ленте записано
исходное предложение, ограниченное с
двух сторон концевыми маркерами,
считывающая головка установлена на
первый символ предложения, магазин пуст
и содержит начальный символ магазина,
магазинный автомат находится в начальном
состоянии. В процессе функционирования
строка на входной ленте просматривается
слева направо без возвратов. На каждом
шаге автомат переходит из одной
конфигурации в следующую.
Под конфигурацией магазинного автомата понимают тройку
- 
 - содержимое магазина, - содержимое магазина,
- 
 - текущее состояние магазинного автомата, - текущее состояние магазинного автомата,
- 
 - часть исходной строки на входной
	ленте, - часть исходной строки на входной
	ленте,
начинающаяся с текущего символа (на
который указывает считывающая головка)
и кончающаяся последним символом строки.
Конфигурацию можно также записать в
виде 
 или
или 
 ,
или
,
или 
 ,
где
,
где 
 - символ на вершине магазина. Начальная
конфигурация в этом случае записывается
в виде
- символ на вершине магазина. Начальная
конфигурация в этом случае записывается
в виде 
 ,
заключительная конфигурация -
,
заключительная конфигурация - 
 ,
где
,
где 
 и
и 
 .
Для записи перехода автомата из одной
конфигурации в другую применяется
бинарное отношение ├, определенное на
конфигурациях автомата. Будем писать
.
Для записи перехода автомата из одной
конфигурации в другую применяется
бинарное отношение ├, определенное на
конфигурациях автомата. Будем писать
 ├
├ ,
где
,
где
 если пара 
 и
и 
 .
Символ
.
Символ 
 считается допущенным, если автомат
читает его из входной строки и переходит
из конфигурации
считается допущенным, если автомат
читает его из входной строки и переходит
из конфигурации 
 в конфигурацию
в конфигурацию 
 .
При этом читающая головка перемещается
на один символ вправо и символ m в
вершине магазина заменяется строкой
магазинных символов b. Если
.
При этом читающая головка перемещается
на один символ вправо и символ m в
вершине магазина заменяется строкой
магазинных символов b. Если 
 ,
то происходит сокращение содержимого
магазина на символ m, при этом в
вершине магазина будет содержаться
следующий магазинный символ.
,
то происходит сокращение содержимого
магазина на символ m, при этом в
вершине магазина будет содержаться
следующий магазинный символ.
Строка символов 
 ,
где
,
где 
 допускается магазинным автоматом, если
существует последовательность
конфигураций такая, что
допускается магазинным автоматом, если
существует последовательность
конфигураций такая, что
 ├
├ ,
,
где 
 .
Поскольку разработчиков компиляторов
мало интересуют пустые символы в строках,
уберем их из определения допускаемой
строки. Тогда строка
.
Поскольку разработчиков компиляторов
мало интересуют пустые символы в строках,
уберем их из определения допускаемой
строки. Тогда строка 
 ,
где
,
где 
 ,
допускается автоматом A, если
существует аналогичная строка, допускаемая
автоматом A, в которой
,
допускается автоматом A, если
существует аналогичная строка, допускаемая
автоматом A, в которой 
 .
Последовательность конфигураций,
которые принимает магазинный автомат
при распознавании строки x обозначается
.
Последовательность конфигураций,
которые принимает магазинный автомат
при распознавании строки x обозначается
 ├
├ ,
,
где 
 .
Если конечное состояние магазина
совпадает с начальным
.
Если конечное состояние магазина
совпадает с начальным 
 ,
говорят, что строка
,
говорят, что строка 
 допускается автоматом A с опустошенным
магазином [4].
допускается автоматом A с опустошенным
магазином [4].
 ├
├
Если автомат имеет пустой начальный
символ магазина 
 ,
то говорят, что он допускает строку x
с пустым магазином.
,
то говорят, что он допускает строку x
с пустым магазином.
 ├
├ 
Язык T(A), допускаемый магазинным автоматом, представляет собой множество строк, определяемых формулой
 и
и 
 ├
├
Рассмотренный магазинный автомат
позволяет на каждом шаге, либо удалить
символ в вершине магазина, либо заменить
его строкой магазинных символов конечной
длины. Это ограничение снято при
определении расширенного магазинного
автомата [1], который позволяет заменять
строки конечной длины , прилегающие к
вершине магазина. Данный магазинный
автомат является недетерминированным,
поскольку 
 или
или 
 имеют множество значений (которое
может содержать и более одного элемента)
и в общем не существует правила для
выбора единственного значения из
множества. Множество может быть и пустым,
тогда автомат не может допускать
следующие входные символы.
имеют множество значений (которое
может содержать и более одного элемента)
и в общем не существует правила для
выбора единственного значения из
множества. Множество может быть и пустым,
тогда автомат не может допускать
следующие входные символы.
Описанные выше магазинные автоматы
могут применяться в качестве
недетерминированных распознавателей
контекстно-свободных языков.
Доказано [1,4], что каждой КС грамматике
 соответствует магазинный автомат A,
такой, что
соответствует магазинный автомат A,
такой, что 
 .
Недетерминированный магазинный
автомат в виде нисходящего распознавателя
строится следующим образом. Определим
множества, описывающие автомат A.
.
Недетерминированный магазинный
автомат в виде нисходящего распознавателя
строится следующим образом. Определим
множества, описывающие автомат A.
 - множество состояний;
- множество состояний;
T - входной алфавит состоит из терминальных символов;
 - алфавит магазинных символов содержит
терминальные и нетерминальные символы;
- алфавит магазинных символов содержит
терминальные и нетерминальные символы;
 - начальное состояние;
- начальное состояние;
 - начальный символ магазина;
- начальный символ магазина;
 - множество конечных состояний.
- множество конечных состояний. 
Функция перехода t определяется следующим образом:
- 
если множество продукций P содержит правило  ,
	то ,
	то содержит содержит для всех продукций с нетерминалом A
	в левой части; для всех продукций с нетерминалом A
	в левой части;
- 
 для для . .
Построим магазинный автомат для
приведенной в разделе 1.2.2 грамматики 
 с продукциями
с продукциями



Автомат будет представлять семерку 
 ,
функция перехода которого имеет вид:
,
функция перехода которого имеет вид:



 для всех
для всех 

При распознавании строки 
 ,
дерево вывода которой представлено на
рис. 1.5 автомат может пройти по следующей
последовательности конфигураций.
,
дерево вывода которой представлено на
рис. 1.5 автомат может пройти по следующей
последовательности конфигураций.
 ├
├
├
├
├
├
├
├
├
├
├
├
├
├
├
├
├
├
├
├
├
├
├
├ 
Изобразим в виде графа состояний 
 недетерминированный автомат, моделирующий
при распознавании левые выводы строк.
Множество V построим таким образом,
что каждой вершине соответствует
нетерминальный символ. Дополним это
множество специальной вершиной для
допуска входных символов строки,
обозначим ее g ( эта
вершина является конечной). Тогда
множество
недетерминированный автомат, моделирующий
при распознавании левые выводы строк.
Множество V построим таким образом,
что каждой вершине соответствует
нетерминальный символ. Дополним это
множество специальной вершиной для
допуска входных символов строки,
обозначим ее g ( эта
вершина является конечной). Тогда
множество 
 .
.
Две вершины, помеченные нетерминальными
символами 
 ,
соединяются ребром
,
соединяются ребром 
 ,
если значение функции перехода
,
если значение функции перехода 
 не пусто и
не пусто и 
 .
При переходе по такому ребру графа
автомат выполняет шаг
.
При переходе по такому ребру графа
автомат выполняет шаг 
 ├
├ .
В случае
.
В случае 
 для шага автомата
для шага автомата 
 ├
├ на графе вводится ребро
на графе вводится ребро 
 .
Аналогично при
.
Аналогично при 
 вводится ребро
вводится ребро 
 для выполнения шага
для выполнения шага 
 ├
├ .
Для значений функции
.
Для значений функции 
 ,
где
,
где 
 вводится ребро
вводится ребро 
 для шага
для шага 
 ├
├ .
Все вершины графа мы соединили ребрами
в соответствии с функцией перехода.
Однако вершина g не имеет выходящих
ребер. Не дополняя функцию перехода,
соединим вершину g со всеми остальными
вершинами. При переходе по такому ребру
конфигурация автомата не изменяется,
т.е. можно записать
.
Все вершины графа мы соединили ребрами
в соответствии с функцией перехода.
Однако вершина g не имеет выходящих
ребер. Не дополняя функцию перехода,
соединим вершину g со всеми остальными
вершинами. При переходе по такому ребру
конфигурация автомата не изменяется,
т.е. можно записать 
 ├
├ для ребра
для ребра 
 .
.

Смену конфигураций при проходе по ребру
будем записывать на нем в виде тройки
 ,
где a – допускаемый символ входной
строки, b - удаляемый из магазина
символ (для расширенного автомата строка
символов), c - помещаемая в магазин
строка символов. Разметка ребер для
приведенных шагов автомата будет
выглядеть следующим образом.
,
где a – допускаемый символ входной
строки, b - удаляемый из магазина
символ (для расширенного автомата строка
символов), c - помещаемая в магазин
строка символов. Разметка ребер для
приведенных шагов автомата будет
выглядеть следующим образом.
 ├
├ ,A,Bw
          или        , A,Bw
	,A,Bw
          или        , A,Bw
 ├
├ ,A,
	,A, 
	,A,
	,A, 
 ├
├ ,A,aw	,A,aw
	,A,aw	,A,aw
 ├
├ a,a,
	a,a,
 ├
├ ,A,A	,A,A
	,A,A	,A,A
Для рассмотренного выше магазинного автомата граф состояний представлен на рис. 1.17.
Как отмечалось выше можно построить
 расширенный МП автомат, моделирующий
правый вывод строки 
 .
Такой автомат строится следующим образом
[1]:
.
Такой автомат строится следующим образом
[1]:
 - множество состояний;
- множество состояний;
T - входной алфавит;
 - алфавит магазинных символов;
- алфавит магазинных символов;
q - начальное состояние автомата;
# - начальный символ магазина;
{r} - множество заключительных состояний.
Функция перехода t:
 содержит
содержит 
 ,
если в грамматике существует продукция
,
если в грамматике существует продукция
 ;
;
 для всех
для всех 
 ;
;
 .
.
Для задания автомата определим граф 
 ,
множество вершин которого
,
множество вершин которого 
 .
Для функции
.
Для функции 
 в графе задается ребро
в графе задается ребро 
 ,
при переходе по которому выполняется
шаг
,
при переходе по которому выполняется
шаг 
 ├
├
 ,
,
 .
.
Здесь и далее при записи конфигураций
автомата строка в магазине записывается
в обратном порядке, т.е. дно магазина
расположено на левом крае строки, а
вершина на правом. Если 
 ,
то задается ребро
,
то задается ребро 
 с шагом автомата
с шагом автомата 
 ├
├ .
.
Аналогично поступаем, если 
 .
Задаем ребро
.
Задаем ребро 
 с шагом
с шагом 
 ├
├ .
Перенос символов с входной ленты в
магазин будет производиться на ребре
.
Перенос символов с входной ленты в
магазин будет производиться на ребре
 с шагом
с шагом 
 ├
├ в соответствии с функцией
в соответствии с функцией 
 .
Для допуска начального символа грамматики
S вводится ребро
.
Для допуска начального символа грамматики
S вводится ребро 
 с шагом
с шагом 
 ├
├ для функции
для функции 
 .
Поскольку после каждой замены подстроки
 в магазине на нетерминальный символ
возможен перенос символов с входной
ленты в магазин вводим ребра
.
Поскольку после каждой замены подстроки
 в магазине на нетерминальный символ
возможен перенос символов с входной
ленты в магазин вводим ребра 
 ,
не изменяющие конфигурацию автомата.
,
не изменяющие конфигурацию автомата.
Построим автомат для рассмотренной
выше грамматики. Он определяется семеркой
 .
Функция перехода автомата будет
следующей.
.
Функция перехода автомата будет
следующей.









 для всех
для всех 


Граф состояний для данного автомата приведен на рис. 1.18.

Строка 
 может распознаваться автоматом в
следующем порядке.
может распознаваться автоматом в
следующем порядке.
 ├
├
├
├
├
├
├
├
├
├
├
├
├
├
├
├
├
├
├
├
├
├
├
├
├
Мы рассмотрели два типа магазинных автоматов. Между ними и контекстно-свободными грамматиками существует полное соответствие. Однако эти автоматы недетерминированные и использовать их для построения трансляторов с рекурсивных языков (Паскаль, Ада и др.) сложно. Недетерминированный разбор предусматривает возвраты, а в рекурсивных языках возвращаться назад приходится не только в текущей строке, но и во всей программе. При трансляции параллельно с синтаксическим анализом выполняется ряд семантических действий над программой. Возврат может вызвать отмену выполненных действий, что затруднительно, а иногда просто невозможно.
Детерминированность автомата, возможность его построения зависит от типа используемой контекстно-свободной грамматики. В теории выделены два типа грамматик LL(k) и LR(k), для которых можно построить детерминированные магазинные автоматы, работающие по принципам как сверху-вниз, так и снизу-вверх. Ограничения, которые наложены на КС-грамматики данных классов, рассматривались выше. Известны методы построения детерминированных автоматов LL(k) и LR(k) - грамматик. Они достаточно подробно рассмотрены в литературе [1,6,7] и останавливаться на них специально мы не будем. Однако эти грамматики и способ построения детерминированных автоматов будут внимательно изучены в свете предлагаемого в книге подхода.
