УСТРАНЕНИЕ ЦЕПНЫХ ПРАВИЛ
ЭКВИВАЛЕНТНЫЕ ПРЕОБРАЗОВАНИЯ КС-ГРАММАТИК
Алгоритм устранения недостижимых символов.
Недостижимые терминалы (группа “в” бесполезных символов) и недостижимые нетерминалы, порождающие терминальные строки (группа “б” бесполезных символов), исключаются из грамматики с помощью алгоритма устранения недостижимых символов.
Вход: КС-грамматика G=(VN, T, P, S)
Выход: Эквивалентная КС-грамматика G’=(N’, T’, P’, S) у которой L(G)=L(G’) и для всех Z Î S’ существуют выводы SÞ*aZb, где a,bÎ (S’)*.
Здесь, как и в предыдущей задаче, сначала решается обратная задача, т.е. определяется множество W достижимых символов Z:
W={Z | Z Î S, $ SÞ*aZb, где a,bÎ (S’)*}.
1. Положить W0=S
2. Вычислить W1= W0 È {X | X Î S, (A®aXb) ÎP, A Î W0 , a,bÎ (S’)*}
3. Если W1¹W0 , то положить W0= W1 и перейти к п.2; иначе положить W= W1
4. Вычислить N’=NÇW, T’==TÇW, Б=S-W, P’=P-PБ, где PБÍP – это множество правил, содержащих недостижимые символы XÎ Б, т.е. PБ = {(X ®a)ÎP для всех XÎ Б , где aÎS}
Пример:Преобразование КС-грамматики с правилами
1) Q ® ab 2)B ® b 3)C ® db
в эквивалентную грамматику, не содержащую бесполезных символов.
Шаг алгоритма | Действия и результаты |
W0=Q | |
W1 = { Q, a,b } | |
W1 = W0 ? Нет W0 = W1={ Q, a, b } | |
W1 = { Q, a, b } | |
W1 = W0 ? Да W ={ Q, a, b } | |
N’= { Q} T’={a, b} Б={B, C, d} P’= {Q ® ab} |
Цепное правило – это правило вида А®В, где А,В Î N. Цепные правила могут быть причиной нежелательных свойств грамматики, таких, например, как циклы. Алгоритм устранения цепных правил осуществляет замещение правой части каждого цепного правила, используя для этого не цепные правила.
Вход: КС-грамматика G=(N, T, P, S) без e-правил.
Выход: Эквивалентная КС-грамматика G’=(N, T, P’, S) без цепных правил.
1. Для каждого нетерминала А вычислить NA = {B | AÞ*B, где BÎ N }:
1.1. Положить N0A={A}
1.2. Вычислить N1A = N0A È{C | (B®C) Î P, B Î N0A , C Î N }
1.3. Если N1A ¹ N0A , то положить N0A = N1A и перейти к п.1.2, иначе положить
NA = N1A
2. Построить множество P’ так: если (В®a) Î P не является цепным правилом (a Ï N), то включить в P’ правило А®a для каждого А, такого, что В Î NA, т.е.
P’={ А®a для всех (В®a) Î P , где a Ï N и В Î NA }
Пример: Преобразовать грамматику G с правилами:
G: S® X
X® Y
Y®Y; | z
в эквивалентную грамматику без цепных правил:
Шаг алгоритма | Действия и результаты |
1.1 | N0S = {S} |
1.2 | N1S = {S, X} |
1.3 | N1S = N0S ? Нет N0S = N1S={S, X} |
1.2 | N1S = {S, X, Y} |
1.3 | N1S = N0S ? Нет N0S = N1S={S, X,Y} |
1.2 | N1S = {S, X, Y} |
1.3 | N1S = N0S ? Да NS ={S, X,Y} |
1.1 | N0X = {X} |
1.2 | N1X = {X,Y} |
1.3 | N1X = N0X ? Нет N0X = N1X={X, Y} |
1.2 | N1X = {X,Y} |
1.3 | N1X = N0X ? Да NX ={X,Y} |
1.1 | N0Y = {Y} |
1.2 | N1Y = {Y} |
1.3 | N1Y = N0Y ? Да NY ={Y} |
P’={S®Y;|z, X®Y; |z , Y®Y; |z} |
Пример:Преобразовать грамматику G с правилами:
G: E® E+T
E®T
T®T*P
T®P
P®i
P®(E)
1. После выполнения шага 1 алгоритма получаем: NE ={E, T, P}, NT ={T, P}, NP ={P}
2. Выберем первый нетерминал E из множества NE. Формируя множество правил , левая часть которых - нетерминальный символ Е, а правые части нецепных правил исходной грамматики, в левой части которых находятся символы из множества NE, получаем: { E® E+T , E®T*P, E®i, E®(E)}. Таким же образом рассматриваем остальные символы из NE, затем символы из NT и NP .
3. Окончательно получаем P’={ E® E+T , E®T*P, E®i, E®(E), T®T*P, T®i, T®(E), P®i, P®(E)}