- •Построение матрицы операторного предшествования
- •Автомат с магазинной памятью (сокращенно мп-автомат)
- •Преобразователь с магазинной памятью (сокращенно мп - преобразователь)
- •Опишем lr(k)-алгоритм разбора.
- •Алгоритм построения управляющей таблицы для lr(0)-грамматики без -правил
- •Алгоритм построения управляющей таблицы для slr(1)-грамматики без -правил
- •Включение -правил в lr(0)- и slr (1)-грамматики
- •Алгоритм построения анализатора типа “перенос –свертка” для грамматик простого предшествования
- •Описание алгоритма
Преобразователь с магазинной памятью (сокращенно мп - преобразователь)
-это восьмёрка P=(Q,T,D,Г,d,q0,Z0,F), где
D - выходной алфавит
d - функция переходов - отображение множества Q x(T U {e})x Г в множество конечных подмножеств Q x Г*, т.е. d :Q x(T U {e}) x Г -> {Q x Г* x D* };
Конфигурацией МП-автомата называется четвёрка (q,w,u,y)<-Q x T* x Г*
Начальной конфигурацией МП - преобразователя P называется конфигурация вида (q0,w,Z0,e)
Опишем lr(k)-алгоритм разбора.
Вход
Анализируемая цепочка z = t1 t2 … tj … tn T*, где j – номер текущего символа входной цепочки, находящегося под читающей головкой.
Управляющая таблица T (множество LR(k)-таблиц) для LR(k)-грамматики
G = < T, N, S, R >.
Выход
Если z L(G), то правый разбор цепочки z, в противном случае – сигнал об ошибке
Описание алгоритма
j :=0.
j := j + 1. Если j > n, то выдать сообщение об ошибке и перейти к п. 5.
Определить цепочку u следующим образом:
а) если k = 0, то u = tj ;
б) если k 1 и j+k-1 n, то u = tj tj+1 … tj+k-1 – первые k символов цепочки
tj, tj+1, …, tn ;
в) если k 1 и j+k-1 > n, то u = tj tj+1 … tn– остаток входной цепочки.
Применить функцию действия f из строки таблицы Т, отмеченной верхним символом магазина T, к цепочке u.
а) f(u) =ПЕРЕНОС. Определить функцию переходов g(tj) из строки таблицы Ʈ, отмеченной символом Т из верхушки магазина. Если g(tj) = T’ и T’ Vp {}, то записать Т’ в магазин и перейти к п.2. Если g(tj) = ОШИБКА, то выдать сигнал об ошибке и перейти к п. 5.
б) f(u) = (СВЕРТКА, i) и A – правило вывода с номером i грамматики G. Удалить из верхней части магазина символов, в результате чего в верхушке магазина окажется символ T’ Vp {}, и выдать номер правила i на выходную ленту. Определить символ T = g(A) из cтроки таблицы Т, отмеченной символом T’, записать его в магазин и перейти к п. 3.
в) f(u) = ОШИБКА.Выдать сообщение об ошибке и перейти к п. 5.
г) f(u) = ДОПУСК. Объявить цепочку, записанную на выходной ленте, правым разбором входной цепочки z.
5) Останов.
Пример
S0 S
S aAb
S c
A bS
A Bb
B aA
B c
T |
f(u) |
g(X) | ||||||||
a |
b |
c |
|
a |
b |
c |
S |
A |
B | |
S0 |
|
|
|
Д |
|
|
|
|
|
|
a1 |
П |
П |
П |
|
a5 |
b3 |
c6 |
|
A1 |
B4 |
A1 |
П |
П |
П |
|
|
b1 |
|
|
|
|
b1 |
С,1 |
С,1 |
С,1 |
С,1 |
|
|
|
|
|
|
c2 |
С,2 |
С,2 |
С,2 |
С,2 |
|
|
|
|
|
|
b3 |
П |
П |
П |
|
a1 |
|
c2 |
S3 |
|
|
S3 |
С,3 |
С,3 |
С,3 |
С,3 |
|
|
|
|
|
|
B4 |
П |
П |
П |
|
|
b4 |
|
|
|
|
b4 |
С,4 |
С,4 |
С,4 |
С,4 |
|
|
|
|
|
|
a5 |
П |
П |
П |
|
a5 |
b3 |
c6 |
|
A5 |
B4 |
A5 |
С,5 |
С,5 |
С,5 |
С,5 |
|
|
|
|
|
|
c6 |
С,6 |
С,6 |
С,6 |
С,6 |
|
|
|
|
|
|
|
П |
П |
П |
|
a1 |
|
c2 |
S0 |
|
|
Рис. 4.6
abcb.
Начальная конфигурация алгоритма – (, abcb, )
Для строки управляющей таблицы, отмеченной символом , f(A) = ПЕРЕНОС, а g(A)=a1, поэтому в магазин записывается символ, входная головка сдвигается на один символ вправо, а алгоритм переходит в конфигурацию (a1, bcb, ). Для строки таблицы, отмеченной символом a1, f(b) = ПЕРЕНОС, а g(b) = b3, следовательно, алгоритм перейдет в конфигурацию (a1b3, cb, ). Далее магазин перейдет в конфигурацию (a1b3c2, b, ).
Рассмотрим теперь строку управляющей таблицы Т, помеченную грамматическим вхождением с2. В этом случае f(b) = (С. 2), значит, необходимо выполнить свертку с использованием правила (2) S c. Правая часть этого правила содержит только один символ, поэтому удаляем из магазина символ с2 и определяем значение функции переходов для символа S из левой части правила (2) в отроке управляющей таблицы Т, отмеченной символом b3, который стал верхним символом магазина. Теперь g(S)=S3 и, следовательно, алгоритм перейдет в конфигурацию
(a1b3 S3, b, 2), и в выходную цепочку запишется 2 (номер использованного правила).
(a1b3 S3, b, 2) ÷ (a1A1, b, 23) ÷ (a1A1b1, , 23) ÷ (S0, , 231),
где конфигурация (S0, , 231) является заключительной, а цепочка 231 – правым разбором цепочки abcb.