- •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.3.Алгоритм построения управляющей таблицы для lr(0)-грамматики без -правил
Рассмотрим управляющую таблицу анализатора для LR(0)-грамматики G2, приведенную на рис. 4.6. Каждый символ магазинного алфавита Vp (грамматическое вхождение символа грамматики из словаря V в правую часть правила вывода) можно интерпретировать как кодированное представление подцепочки из правой части правила, последним символом которой он является.
При такой интерпретации магазинный символ вталкивается только тогда, когда символ из верхушки магазина является кодированным представлением префикса подцепочки, представляемой вталкиваемым в магазин символом, или когда вталкиваемый символ представляет новый префикс правой части какого-либо правила. Перенос символов в магазин осуществляется до тех пор, пока в верхушке магазина не окажется символ, являющийся кодированным представлением основы. В этом случае цепочка магазинных символов, соответствующих основе, выталкивается из магазина, и в магазин вталкивается символ, который представляет подцепочку, совместимую с подцепочкой, представляемой магазинным символом, расположенным под основой.
Рассмотрим, например, вторую строку управляющей таблицы, отмеченную грамматическим вхождением a1, которое представляет префикс правой части правила (1). Пусть b – текущий входной символ. Согласно правилу (1) за a1 может следовать грамматическое вхождение нетерминала A1 или символ, представляющий подцепочку, порождаемую вхождением A1. Цепочка, порождаемая A1, может начинаться либо вхождением b3 ( правило (3)), либо вхождениемB4 (правило (4)), которое в свою очередь порождает цепочку, начинающуюся с a5 или c6. Следовательно, для входного символа b в магазин можно втолкнуть только грамматическое вхождение b3, которое является кодированным представлением префикса правой части правила (3).
Строка таблицы, отмеченная маркером дна магазина , соответствует начальной конфигурации алгоритма. В начальный момент времени в магазин можно записать только грамматическое вхождение a1 или с2, которые представляют префиксы цепочек, выводимых из начального вхождения S0, (грамматического вхождения начального символа грамматики S, входящего в правую часть нулевого правила вывода пополненной грамматики).
Как следует из таблицы, функция действия f(u) не зависит от текущего входного символа, а определяется только верхним символом магазина. Это означает, что для выбора нужного действия (переноса или свертки) алгоритм не должен заглядывать вперед на символы входной цепочки и, следовательно, k=0. Алгоритм построения управляющей таблицы для LR(0)-грамматик основывается на рассмотрении пар грамматических вхождений, которые могут быть представлены соседними магазинными символами в процессе разбора допустимых цепочек.
Введем ряд понятий, которые понадобятся для построения управляющей таблицы.
Пусть Хi и Zi – грамматические вхождения символов Х и Z в правую часть i-го правила, a Yj – грамматическое вхождение символа Y в правую часть j-го правила. Определим множество ВПЕРВ( Yj) (ВХОДИТ_ПЕРВЫМ), в которое включим Yj и все грамматические вхождения, которыми могут начинаться цепочки, выводимые из Y.
ВПЕРВ(Yj) = { Yj } { Xi Y A X и
Xi - самое левое грамматическое вхождение в правую часть правила A X} .
Заметим, что если в грамматике есть правила с пустой правой частью, то на последнем шаге вывода они не применяются.
Используя множества ВПЕРВ, определим отношение ВПОД (ВХОДИТ_ПОД) следующим образом:
Xi ВПОД Yj – это множество {( Xi,Yj ) A XiZi R и Yj BПЕРВ(Zi) } ;
ВПОД Yj – это множество { ( ,Yj ) Yj BПЕРВ(S0) } .
В последнем определении S0 – начальное вхождение.
Отношение Xi ВПОД Yj определяет множество Q грамматических вхождений Xi, для которых представляющие их магазинные символы могут встретиться в магазине непосредственно под символом, представляющим Yj.
Отношение ВПОД будем задавать с помощью матрицы, содержащей n столбцов и n+1строк, где n – число грамматических вхождений пополненной грамматики G’. Первые n строк и столбцы матрицы отмечены грамматическими вхождениями, а последняя отрока – маркером дна магазина. Если Xi ВПОД Yj, то элемент матрицы, расположенный в строке Xi и столбце Yj, равен 1.
Пример 4.2.
Построим матрицу отношения ВПОД для грамматики G2 ('см. рис. 4.3).
Непосредственно из правил вывода (1) и (4) получим:
A1 ВПОД b1 и B4 ВПОД b4.
Из определения отношения ВПОД ВПОД Yj тогда и только тогда, когда Yj ВПЕРВ(S0). Из S можно вывести цепочки:
S a1A1b1 и S c2 .
Следовательно, ВПЕРВ(S0) = {a1, c2, S0 } и ВПОД а1, ВПОД c2 и ВПОД S0.
Рассмотрим правило (1). Из определения отношения ВПОД следует, что a1 ВПОД Yj для всех. Yj ВПЕРВ(A1). Из А можно вывести цепочки:
A b3S3 , A B4b4 c6b4 , A B4b4 a5A5b4 .
Следовательно, ВПЕРВ (А1) = { a5, b3, c6, A1, B4 } и a1 ВПОД a5, a1 ВПОД b3,
a1 ВПОД c6, a1 ВПОД A1, a1 ВПОД B4.
Поступая подобным образом для правил (3) и (6), получим матрицу отношения ВПОД, приведенную на рис. 4.7.
|
S0 |
a1 |
A1 |
b1 |
c2 |
b3 |
S3 |
B4 |
b4 |
a5 |
A5 |
c6 |
S0 |
|
|
|
|
|
|
|
|
|
|
|
|
a1 |
|
|
1 |
|
|
1 |
|
1 |
|
1 |
|
1 |
A1 |
|
|
|
1 |
|
|
|
|
|
|
|
|
b1 |
|
|
|
|
|
|
|
|
|
|
|
|
c2 |
|
|
|
|
|
|
|
|
|
|
|
|
b3 |
|
1 |
|
|
1 |
|
1 |
|
|
|
|
|
S3 |
|
|
|
|
|
|
|
|
|
|
|
|
B4 |
|
|
|
|
|
|
|
|
1 |
|
|
|
b4 |
|
|
|
|
|
|
|
|
|
|
|
|
a5 |
|
|
|
|
|
1 |
|
1 |
|
1 |
1 |
1 |
A5 |
|
|
|
|
|
|
|
|
|
|
|
|
c6 |
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
1 |
|
|
1 |
|
|
|
|
|
|
|
Риc. 4.7
Опишем алгоритм построения управляющей таблицы LR(0)-анализатора (множества LR(0)-таблиц) для LR(0)-грамматики, не содержащей правил с пустой правой частью (-правил). Этот алгоритм можно также использовать для проверки принадлежности КС-грамматики классу LR(0).
Вход
КС-грамматика G = < T, N, S, R > без -правил.
Выход
Множество LR(0)-таблиц для грамматики G или сообщение о том, что грамматика G не является LR(0)-грамматикой.
Описание алгоритма
Построить пополненную грамматику G’ для исходной грамматики G.
Вычислить отношения ВПОД для грамматических вхождений грамматики G’.
Определить функции переходов g(Х) следующим образом:
а) Построить таблицу, содержащую по одному столбцу для каждого символа из V {} и одной отроке для каждого грамматического вхождения грамматики G’и маркера дна. Элемент в строке, помеченной грамматическим вхождением Хi или маркером дна , и столбце, отмеченном символом грамматики Y, должен содержать все грамматические вхождения, для которых справедливо отношение Хi ВПОД Yj. Заметам, что некоторые элементы построенной таким образом таблицы могут содержать более одного грамматического вхождения, т.е. таблица может быть недетерминированной.
б) Интерпретируя построенную таблицу как таблицу конечного автомата (состояния - грамматические вхождения и маркер дна (начальное состояние), а входные символы - символы из V {}), определить тип автомата: детерминированный или недетерминированный. Недетерминированный автомат преобразовать в эквивалентный ему детерминированный автомат.
в) Определить магазинный алфавит Vp так, чтобы каждому состоянию детерминированного конечного автомата соответствовал ровно один магазинный символ.
В качестве символов алфавита Vp можно использовать любые символы, не являющиеся символами словаря V’ грамматики G’. Для сохранения наглядности цепочек, представимых магазином, будем считать, что символы из Vp совпадают по написанию с соответствующими грамматическими вхождениями. Если магазинный символ представляет множество грамматических вхождений, то индексы магазинных символов будем обозначать строчными латинскими буквами.
г) Заменить совокупности грамматических вхождений, отмечающих состояния автомата, соответствующими символами из Vp.
Полученная таблица представляет собой таблицу функций переходов g(X) LR(0)-анализатора, причем элементы таблицы, соответствующие переходу в пустое множество состояний, имеют значение ОШИБКА.
Определить функции действия f(a) для всех магазинных символов, каждому из которых соответствует одна строка таблицы. Количество столбцов таблицы f(a) определяется количеством символов в T {}. Элементы таблицы f(a) определяются следую щим образом.
а) Если магазинному символу Т соответствует единственное вхождение S0, то в строке, отмеченной символом Т, f() = ДОПУСК, а все остальные элементы – ОШИБКА.
б) Если магазинному символу Т соответствует только одно грамматическое вхождение Xi, являющееся самым правым вхождением в i-е правило вывода грамматики G, то все элемента строки, помеченной Т, имеют значение (СВЕРТКА, i).
в) Если магазинному символу Т соответствует маркер дна магазина или все грамматические вхождения, представляемые символом Т, не являются самыми правыми в своих правилах, то в строке, отмеченной Т, f() = ошибка, а значения остальных элементов – ПЕРЕНОС.
г) Если множество вхождений, соответствующее магазинному символу Т, содержит начальное вхождение S0 и хотя бы еще одно вхождение, отличное от которое не является самым правым в своем правиле, то в строке, отмеченной Т, f() = ДОПУСК, а значение всех остальных элементов - ПЕРЕНОС.
Если имеется множество грамматических вхождений, не удовлетворяющих перечисленнымвыше условиям, то G не является LR(0)-грамматикой.
Если построение f(a) закончено успешно, то грамматика является LR(0)-грамматикой, а таблица, полученная объединением таблиц, задающих функции f(a) и g(X) – управляющей таблицей Ʈ LR(0)-анализатора.
Пример 4.3.
Построим управляющую таблицу LR(0)-анализатора для грамматики G3 (рис. 4.8).
О
E E + T
E T
T (E)
T i
Рис. 4.8
пределим пополненную грамматику
G3’= < T, N {S}, S, R { S E }>.
Вычислим отношение ВПОД для грамматических вхождений грамматики G3’. Матрица отношения ВПОД изображена на рис. 4.9.
|
E0 |
E1 |
+1 |
T1 |
T2 |
(3 |
E3 |
)3 |
i4 |
E0 |
|
|
|
|
|
|
|
|
|
E1 |
|
|
1 |
|
|
|
|
|
|
+1 |
|
|
|
1 |
|
1 |
|
|
1 |
T1 |
|
|
|
|
|
|
|
|
|
T2 |
|
|
|
|
|
|
|
|
|
(3 |
|
1 |
|
|
1 |
1 |
1 |
|
1 |
E3 |
|
|
|
|
|
|
|
1 |
|
)3 |
|
|
|
|
|
|
|
|
|
i4 |
|
|
|
|
|
|
|
|
|
|
1 |
1 |
|
|
1 |
1 |
|
|
1 |
Рис.4.9
Определим функции переходов g(X).
а) Построим таблицу переходов конечного (недетерминированного) автомата (рис. 4.10,а).
б) Преобразуем недетерминированный автомат в эквивалентный ему детерминированный автомат, таблица переходов которого изображена на рис. 4.10,б.
в) Определим множество магазинных символов (рис. 4.11).
Функции переходов g(Х) LR(0)-анализатора для грамматики G3 приведены на рис. 4.12.
а)
|
E |
T |
( |
) |
i |
+ |
E0 |
|
|
|
|
|
|
E1 |
|
|
|
|
|
+1 |
+1 |
|
T1 |
(3 |
|
i4 |
|
T1 |
|
|
|
|
|
|
T2 |
|
|
|
|
|
|
(3 |
E1, E3 |
T2 |
(3 |
|
i4 |
|
E3 |
|
|
|
)3 |
|
|
)3 |
|
|
|
|
|
|
i4 |
|
|
|
|
|
|
|
E0, E1 |
T2 |
(3 |
|
i4 |
|
б)
|
E |
T |
( |
) |
i |
+ |
{ } |
{ E0, E1 } |
{ T2 } |
{ (3 } |
|
{ i4 } |
|
{ E0, E1 } |
|
|
|
|
|
{ +1 } |
{ T2 } |
|
|
|
|
|
|
{ (3 } |
{ E1, E3 } |
{ T2 } |
{ (3 } |
|
{ i4 } |
|
{ i4 } |
|
|
|
|
|
|
{ +1 } |
|
{ T1 } |
{ (3 } |
|
{ i4 } |
|
{ E1, E3 } |
|
|
|
{ )3 } |
|
{ +1 } |
{ T1 } |
|
|
|
|
|
|
{ )3 } |
|
|
|
|
|
|
Рис. 4.10
|
{E0, E1 } |
{ E1, E3 } |
{ } |
{ T2 } |
{ (3 } |
{ i4 } |
{ +1 } |
{ T1 } |
{ )3 } |
Vp |
Ex |
Ey |
|
T2 |
(3 |
i4 |
+1 |
T1 |
)3 |
Рис. 4.11
g(X) |
E |
T |
( |
) |
i |
+ |
|
Ex |
T2 |
(3 |
|
i4 |
|
Ex |
|
|
|
|
|
+1 |
T2 |
|
|
|
|
|
|
(3 |
Ey |
T2 |
(3 |
|
i4 |
|
i4 |
|
|
|
|
|
|
+1 |
|
T1 |
(3 |
|
i4 |
|
Ey |
|
|
|
)3 |
|
+1 |
T1 |
|
|
|
|
|
|
)3 |
|
|
|
|
|
|
Рис. 4.12
Определим функции действия f(a).
Построим таблицу, содержащую по одной строке для каждого магазинного символа и одному столбцу для каждого символа из T {}. Заполним построенную таблицу в соответствии с п. 4.алгоритма.
Для строки таблицы, отмеченной символом , соответствующее множество грамматических вхождений состоит из единственного символа , поэтому в этой отроке f() = ошибка, а значения остальных элементов – ПЕРЕНОС (см. п.4,в алгоритма).
Множество грамматических вхождений, соответствующих магазинному символу Еx, содержит два элемента: Е0 и Е1. Так как в это множество входит начальное вхождение E0, а вхождение Е1 не является самым правым в правиле (1), то в соответствии c п. 4,г алгоритма f() = ДОПУСК, а остальные элементы строки, отмеченные символом Еx, имеют значение ПЕРЕНОС.
Магазинному символу Т2 соответствует единственное грамматическое вхождение Т2, которое является самым правым в правиле вывода (2) грамматики G3. Следовательно, значение всех элементов строки, помеченной Т2, – (СВЕРТКА, 2). Поступая подобным образом для остальных строк, получим таблицу функций переходов f(a),приведенную на рис. 4.13.
f(a) |
( |
) |
i |
+ |
|
|
П |
П |
П |
П |
|
Ex |
П |
П |
П |
П |
Д |
T2 |
С,2 |
С,2 |
С,2 |
С,2 |
С,2 |
(3 |
П |
П |
П |
П |
|
i4 |
С,4 |
С,4 |
С,4 |
С,4 |
С,4 |
+1 |
П |
П |
П |
П |
|
Ey |
П |
П |
П |
П |
|
T1 |
С,1 |
С,1 |
С,1 |
С,1 |
С,1 |
)3 |
С,3 |
С,3 |
С,3 |
С,3 |
С,3 |
Рис. 4.13
Поскольку при построении f(a) не возникло конфликтных ситуаций, грамматика G3 – LR (0)-грамматика. Объединив функции g(X) и f(a) в одну таблицу, получим управляющую таблицу Ʈ LR(0)-анализатора для грамматики G3.