
Предсказывающие алгоритмы разбора
Разбор для LL(k)-грамматики удобно осуществлять с помощью так называемого k-предсказывающего алгоритма разбора, k-предсказывающий алгоритм А для КС-грамматики G=(N,,P,S) использует входную ленту, магазин и выходную ленту и, по существу, моделирует работу МП-преобразователя, опустошающего магазин .
Рис.
Этот алгоритм пытается проследить левый вывод цепочки, записанной на его входной ленте.
При чтении анализируемой цепочки, находящейся на входной ленте, входная головка может “заглядывать вперед” на k очередных символов (отсюда число k в названии k-предсказывающего алгоритма). Эту цепочку из k символов, увиденную впереди входной головкой, будем называть аванцепочкой. На рис. аванцепочкой служит подцепочка u входной цепочки wux.
Магазин содержит цепочку X$, где Х - цепочка магазинных символов из алфавита Г, $ – специальный символ для маркировки дна магазина. Выходная лента содержит цепочку , состоящую из номеров правил.
Определение. Конфигурацией предсказывающего алгоритма А называется тройка (x, X, ), где
1) x — неиспользованная часть входной цепочки;
2) X — содержимое магазина (X — верхний символ);
3) — выходная цепочка.
Работу алгоритма А определяет управляющая таблица М:
(Г {$}) *k {(, i), выброс, допуск, ошибка},
где Г * — цепочка, построенная из магазинных символов;
i — номер правила из множества Р.
На каждом такте сначала определяется аванцепочка u и верхний символ магазина Х. Затем рассматривается элемент М(Х, u) управляющей таблицы и в соответствии с его содержанием выполняется одно из 4 действий:
1) если М(Х,
u) = (,
i), то
(x, X,
)
(x, ,
i), т.е. верхний
символ магазина заменяется цепочкой
и к выходу добавляется номер правила
i,
входная головка не сдвигается;
2) если М(а,
u)= «выброс»
и x=a
,
то (x, a,
)
(
,
,
),
т.е. если верхний символ магазина
совпадает с текущим входным символом,
то он выбрасывается из магазина и входная
головка сдвигается на один символ
вправо;
3) если алгоритм достигает конфигурации (e, $, ), работа прекращается и выходная цепочка называется разбором первоначальной входной цепочки. Будем считать, что M($, e) = «допуск» и (e, $, ) — допускающая конфигурация;
4) если M(Х, u)= «ошибка», то разбор прекращается и выдается сообщение об ошибке, а соответствующая конфигурация (x, X, ) называется ошибочной.
Для входной цепочки и ее разбора , получаемого на выходе алгоритма А, будем писать А()=.
Определение. Переводом, определяемым алгоритмом А, называется множество:
(А) = { (, ) | A() = }.
Определение. Алгоритм разбора А для КС-грамматики G называется корректным, если:
1) L(G) = { | A() определено};
2) если A() = , то — левый разбор цепочки .
Управляющая таблица такого алгоритма называется корректной управляющей таблицей для грамматики G.
Пример . 1-предсказывающий алгоритм для простой LL(1)-грамматики G с правилами:
(1) S aAS,
(2) S b,
(3) A a,
(4) A bSA.
Управляющая таблица показана в табл.
Таблица
Верхний символ магазина |
Аванцепочка |
||
|
a |
b |
e |
S |
aAS,1 |
b,2 |
ошибка |
А |
a,3 |
bSA,4 |
ошибка |
a |
выброс |
ошибка |
ошибка |
b |
ошибка |
выброс |
ошибка |
$ |
ошибка |
ошибка |
допуск |
Рассмотрим потактно работу алгоритма для входной цепочки =abbab:
(abbab, S$, e) (abbab, aAS$, 1)
(bbab, AS$, 1)
(bbab, bSAS$, 14)
(bab, SAS$, 14)
(bab, bAS$, 142)
(ab, AS$, 142)
(ab, AS$, 1423)
(b, S$, 1423)
(b, b$, 14232)
(e, $, 14232)
Итак, А(abbab) = 14232. Легко убедиться, что это левый разбор.