- •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.4.Алгоритм построения управляющей таблицы для slr(1)-грамматики без -правил
Усовершенствуем алгоритм построения управляющей таблицы, рассмотренный в 4.2.3, так, чтобы получить анализатор для некоторого класса грамматик, не принадлежащих классу LR(0). Этот класс грамматик является подклассом LR(1)-грамматик и получил название SLR(1)-грамматик без -правил. Буква S в названии грамматики является сокращением английского слова Simple (простой).
Рассмотрим следующий пример.
Пример 4.4.
Построить управляющую таблицу LR(0)-анализатора для грамматики G0, правила вывода которой приведены на рис. 4.14.
Матрица отношения ВПОД, определенная на множестве грамматических вхождений пополненной грамматики
G0’= < T, N { S }, S, R { S E } >,
п
E
E + T
E
T
T
TP
T
P
P
(E)
P
i Рис. 4.14
Выполняя шаг 4 алгоритма, обнаруживаем, что Goне принадлежит классуLR(0)-грамматик, так как множества грамматических вхождений, соответствующие магазинным символамТx иTy, содержат самые правые вхождения символаТи не являются одноэлементными.
|
E0 |
E1 |
+1 |
T1 |
T2 |
T3 |
3 |
P3 |
P4 |
(5 |
E5 |
)5 |
i6 |
E0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
E1 |
|
|
1 |
|
|
|
|
|
|
|
|
|
|
+1 |
|
|
|
1 |
|
1 |
|
|
1 |
1 |
|
|
1 |
T1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
T2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
T3 |
|
|
|
|
|
|
1 |
|
|
|
|
|
|
3 |
|
|
|
|
|
|
|
1 |
|
1 |
|
|
1 |
P3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
P4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
(5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
E5 |
|
1 |
|
|
1 |
1 |
|
|
1 |
1 |
1 |
|
1 |
)5 |
|
|
|
|
|
|
|
|
|
|
|
1 |
|
i6 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
1 |
|
|
1 |
1 |
|
|
1 |
1 |
|
|
1 |
Рис. 4.15
Покажем, как сделав некоторый дополнительный анализ, можно определить функции действия f(a) для данной грамматики. Анализ выполняется для каждого элемента отроки таблицы отдельно и использует текущий входной символ (k=1).
-
+
(
)
i
E
T
P
(5
i6
E0, E1
T2, T3
P4
E0
E1
+1
+1
(5
i6
T1, T3
P4
T1
T2
T3
3
3
(5
i6
P3
P3
P4
(5
(5
i6
E1, E5
T2, T3
P4
E5
)5
)5
i6
Рис.4.16
|
+ |
|
( |
) |
i |
E |
T |
P |
{ } |
|
|
{ (5 } |
|
{ i6 } |
{ E0, E1} |
{ T2, T3 } |
{ P4 } |
{ (5 } |
|
|
{ (5 } |
|
{ i6 } |
{ E1, E5 } |
{ T2, T3 } |
{ P4 } |
{ i6 } |
|
|
|
|
|
|
|
|
{ E0, E1 } |
{ +1 } |
|
|
|
|
|
|
|
{ T2, T3 } |
|
{ *3 } |
|
|
|
|
|
|
{ P4 } |
|
|
|
|
|
|
|
|
{ E1, E5 } |
{ +1 } |
|
|
{ )5 } |
|
|
|
|
{ +1 } |
|
|
{ (5 } |
|
{ i6 } |
|
{ T1, T3 } |
{ P4 } |
{ 3} |
|
|
{ (5 } |
|
{ i6 } |
|
|
{ P3 } |
{ )5 } |
|
|
|
|
|
|
|
|
{ T1, T3 } |
|
{ 3} |
|
|
|
|
|
|
{ P3 } |
|
|
|
|
|
|
|
|
Рис. 4.17
Рассмотрим, например, элемент управляющей таблицы для магазинного символа Тx, которому соответствует множество грамматических вхождений { Т2, Т3 }. Наличие в Тx самого правого вхождения Т2 в правило вывода (2) говорит о том, что необходимо выполнить операцию (СВЕРТКА, 2), а тот факт, что в Тx содержится T3, свидетельствует в пользу операции ПЕРЕНОС.
|
{Eo,E1} |
{E1,E5} |
{T2,T3} |
{T1,T3} |
{P3} |
{P4} |
{+1} |
{3} |
{(5} |
{)5} |
{i6} |
{} |
Vp |
Ex |
Ey |
Tx |
Ty |
P3 |
P4 |
+1 |
3 |
(5 |
)5 |
i6 |
|
Рис. 4.18
-
g(X)
+
(
)
i
E
T
P
(5
i6
Ex
Tx
P4
(5
(5
i6
Ey
Tx
P4
i6
Ex
+1
Tx
3
P4
Ey
+1
)5
+1
(5
i6
Ty
P4
3
(5
i6
P3
)5
Ty
3
P3
Рис. 4.19
Допустим, что входным символом является +. Для магазинного символа Тx
ОШИБКА, и следовательно, для допустимых входных цепочек в строке Тx f(+) = (СВЕРТКА, 2).
Для входного символа g()=3, значит, при анализе допустимых входных цепочек перенос в магазин символа будет правильным действием. Выполнение операции (СВЕРТКА, 2) в этом случае привело бы к тому, что в магазин был бы помещен магазинный символ, представляющий нетерминал Е. Так как входным символом при этом остается , то на следующем шаге был бы выработан сигнал об ошибке, поскольку символ не может непосредственно следовать за Е ( не принадлежит множеству СЛЕД(Е)). Таким образом, операция (СВЕРТКА, 2) исключается, и в строке управляющей таблицы, помеченной Тx , f() = ПЕРЕНОС.
Принципы, продемонстрированные при выполнении данного примера, позволяют сформулировать шаг 4 алгоритма построения управляющей таблицы для SLR(1)-грамматик.
4) Для магазинного символа Т, представляющего множество грамматических вхождений Q, и входного символа a значение f(a) определяется следующим образом.
а) Если начальное вхождение S0 Q и a = , то f() = ДОПУСК.
б) Если a и g(a) ошибка, то f(a) = перенос.
в) Если Xj Q – самое правое грамматическое вхождение i-го правила AXj и a СЛЕД(А), то f(a) = (СВЕРТКА, i). Значение остальных элементов таблицы для f(a) – ОШИБКА.
Если имеется множество грамматических вхождений, не удовлетворяющих условиям а, б и в, то грамматика не принадлежит классу SLR(1).
Продолжение примера 4.4
Функции действия f(a) для рассматриваемого примера изображены на рис. 4.20.
-
f(a)
+
(
)
i
П
П
(5
П
П
i6
С, 6
С, 6
С, 6
С, 6
Ex
П
Д
Tx
С, 2
П
С, 2
С, 2
P4
С, 4
С, 4
С, 4
С, 4
Ey
П
П
+1
П
П
3
П
П
)5
С, 5
С, 5
С, 5
С, 5
Ty
С, 1
П
С, 1
С, 1
P3
С, 3
С, 3
С, 3
С, 3
Рис. 4.20