- •4.Восходящие методы обработки языков
- •41. Неформальное описание восходящего анализа
- •4.2.1.Определение lr(к)-грамматики
- •4.2.2. Алгоритм разбора для lr(k)-грамматики
- •4.2.3.Алгоритм построения управляющей таблицы для lr(0)-грамматики без -правил
- •4.2.4.Алгоритм построения управляющей таблицы для slr(1)-грамматики без -правил
- •4.2.5.Включение -правилв lr(0)-иSlr (1)-грамматики
4.2.5.Включение -правилв lr(0)-иSlr (1)-грамматики
Задача построения управляющей таблицы для LR(0)- и SLR(1)-грамматик c -правилами осложняется тем, что на каждом шаге работы анализатора можно считать, что верхушка магазина совпадает с правой частью любого -правила (например, с номером i), и следовательно, имеются основания полагать, что функция действия f(а) для всех аргументов имеет значение (СВЕРТКА, i).
Доказано, что для данной пары магазинного Т и входного a символов и правила вывода А с номером i в строке Т управляющей таблицы Ʈ f(a)=(СВЕРТКА, i) тогда и только тогда, когда a СЛЕД(А) и g(A) ОШИБКА.
Первые три шага алгоритма построения управляющей таблицы для LR(0)- и SLR(1)-грамматик, описанные в 4.2.3, остаются без изменений, так как добавление к грамматике или удаление из нее -правил не изменяет множества грамматических вхождений и, следовательно, не влияет на отношение ВПОД.
Для учета -правил шаг 4 алгоритма построения управляющей таблицы для LR(0)- и SLR(1)-грамматик необходимо расширить следующим действием:
г) если А – правило вывода с номером i и множество
СЛЕД (A) ={aj 1j m , где m – количество символов в T { } },
то f(aj) = (СВЕРТКА, i) в тех строках управляющей таблицы, для которых g(A) ОШИБКА.
Пример 4.6
Построить управляющую таблицу для SLR(1)-грамматики G4, правила вывода которой приведены на рис. 4.21.
S
bABd
A
Aa
A
B
Bc
B
Рис.
4.21
G4’= < T, N { S’}, S’, R { S S’} >
приведена на рис. 4.22, таблицы переходов недетерминированного и эквивалентного ему детерминированного конечного автомата изображены на рис. 4.23 и 4.24 соответственно, а на рис. 4.25 приведен магазинный алфавит анализатора.
-
S0
b1
A1
B1
d1
A2
a2
B4
c4
S0
b1
1
1
A1
1
1
B1
1
d1
A2
1
a2
B4
1
c4
1
1
Рис.4.22
-
S
A
B
a
b
c
d
S0
b1
A1,A2
A1
B1,B2
B1
d1
d1
A2
a2
a2
B4
c4
c4
S0
b1
Рис. 4.23
-
S
A
B
a
b
c
d
{ S0 }
{ b1 }
{A1,A2}
{A1,A2}
{B1, B4}
{a2}
{B1, B4}
{c4}
{d1}
{a2}
{c4}
{d1}
{}
{ S0 }
{ b1 }
Рис. 4.24
-
{ S0 }
{ b1 }
{A1,A2}
B1, B4}
{a2}
{c4}
{d1}
{}
Vp
S0
b1
Ax
Bx
a2
c4
d1
Рис. 4.25
После применения алгоритма построения управляющей таблицы SLR(1)-анализатора для грамматики G без -правил (3) и (5) получим управляющую таблицу Ʈ, изображенную на рис. 4.26 (в клетках, выделенных серым цветом, в этот момент находятся значения ОШИБКА).
Выполним п.4 алгоритма. Для правила (3) имеем: СЛЕД(А) = { a, c, d } и g(A)=Ax в строке, отмеченной символом b1. Следовательно, в этой строке f(a)= (СВЕРТКА, 3), f(с) = (СВЕРТКА, 3) и f(d) = (СВЕРТКА, 3).
Аналогично для правила (5): СЛЕД(B) = { c, d } и g(B)=Bx в строке, отмеченной символом Ax. Таким образом, в строке Ax f(с) = (СВЕРТКА, 5) и f(d) = (СВЕРТКА, 5).
T |
f(u) |
g(X) | ||||||||||
a |
b |
c |
d |
|
S |
A |
B |
a |
b |
c |
d | |
S0 |
|
|
|
|
Д |
|
|
|
|
|
|
|
b1 |
С,3 |
|
С,3 |
С,3 |
|
|
Ax |
|
|
|
|
|
Ax |
П |
|
С,5 |
С,5 |
|
|
|
Bx |
a2 |
|
|
|
Bx |
|
|
П |
П |
|
|
|
|
|
|
c4 |
d1 |
a2 |
С,2 |
|
С,2 |
С,2 |
|
|
|
|
|
|
|
|
c4 |
|
|
С,4 |
С,4 |
|
|
|
|
|
|
|
|
d1 |
|
|
|
|
С,1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
S0 |
|
|
|
b1 |
|
|
Рис. 4.26