Системное программное обеспечение: Основы трансляции. Карпушин А.Н - 43 стр.

UptoLike

45
Матрицу предшествования грамматики сложно построить, опираясь непо-
средственно на определения отношений предшествования. Удобнее воспользо-
ваться двумя дополнительными множествамимножеством крайних левых и
множеством крайних правых символов относительно нетерминальных симво-
лов грамматики. Эти множества определяются следующим образом:
L(A) = {X | A*Xz}, AVN, XV, zV* – множество крайних левых
символов относительно нетерминального символа А (цепочка z может
быть и пустой цепочкой);
R(A) = {X | A*zX}, AVN, XV, zV* – множество крайних правых
символов относительно нетерминального символа А.
Иными словами, множество крайних левых символов относительно нетер-
минального символа Аэто множество всех крайних левых символов в цепоч-
ках, которые могут быть выведены из символа А. Аналогично определяется и
множество крайних правых символов относительно нетерминального символа
А. Тогда отношения предшествования можно определить так:
В
i
=• B
j
( B
i
, B
j
V), если правило AxB
i
B
j
y Р, где A VN, x,yV*;
В
i
<• B
j
( B
i
, B
j
V), если правило AxB
i
Dy Р и B
j
L(D), где
A,DVN, x,yV*;
В
i
•> Bj ( B
i
, B
j
V), если правило AxCB
j
y Р и B
i
R(C) или пра-
вило AxCDy Р и B
i
R(C), B
j
L(D), где A,C,DVN, x,yV*.
Такое определение отношений удобнее на практике, так как не требует по-
строения выводов, а множества L(A) и R(A) могут быть построены для каждого
нетерминального символа AVN грамматики G(VN,VT,P,S), V = VTVN по
следующему алгоритму:
Шаг 1. AVN:
R
o
(A) = {X | АуХ, XV, yV*}, L
0
(A) = {X | AXy, XV, yV*}, i:= 1.
Для каждого нетерминального символа А ищем все правила, содержащие
А в левой части. Во множество L(A) включаем самый левый символ из правой
части правил, а во множество R(A) — самый крайний правый символ из правой
части. Переходим к шагу 2.
Шаг 2. AVN:
R
i
(A) = R
i-1
(A) R
i-1
(B), В (R
i-1
(A) VN),
L
i
(А) = L
i-1
(A) L
i-1
(B), В (L
i-1
(A) VN).
Для каждого нетерминального символа А: если множество L(A) содержит
нетерминальные символы грамматики А', А", …, то его надо дополнить симво-
лами, входящими в соответствующие множества L(A'), L(A"), ... и не входящи-
ми в L(A). Ту же операцию надо выполнить для R(A).
Шаг 3. Если AVN: R
i
(A) R
i-1
(A) или L
i
(A) L
i-1
(A), то i:=i+l и вер-
нуться к шагу 2, иначе построение закончено: R(A) = R
i
(A) и L(A) = L
i
(A).
Если на предыдущем шаге хотя бы одно множество L(A) или R(A) для не-
которого символа грамматики изменилось, то надо вернуться к шагу 2, иначе
построение закончено.
После построения множеств L(A) и R(A) по правилам грамматики создает-
ся матрица предшествования. Матрицу предшествования дополняют