Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория языков программирования и методы трансляции..pdf
Скачиваний:
28
Добавлен:
05.02.2023
Размер:
3.41 Mб
Скачать

97

3.10.2.3. Алгоритм устранения бесполезных символов

На базе двух рассмотренных алгоритмов построим обобщенный алго-

ритм устранения бесполезных символов.

Вход. КС-грамматика G = (N, Σ, P, S), у которой L(G).

Выход. КС-грамматика G' = (N', Σ', P', S), у которой L(G') = L(G) и в

N' Σ' нет бесполезных символов.

Метод:

1)Применив к G алгоритм «Не пуст ли язык?», получить Ne, положить

G1 = (N Ne, Σ, P1, S), где P1 состоит из множества правил P, содер-

жащих только символы из Ne Σ.

2)Применив к G1 алгоритм «Устранение недостижимых символов»,

получить G' = (N', Σ', P', S).

Таким образом, на шаге 1) нашего алгоритма из G устраняются все нетерминалы, которые не могут порождать терминальных цепочек. Затем на шаге 2) устраняются все недостижимые символы.

Каждый символ X результирующей грамматики должен появиться хотя бы в одном выводе вида S * wXy * wxy.

· · · · · · · · · · · · · · · · · · · · · · ·

 

Выводы · · · · · · · · · · · · · · · · · · · · · · ·

 

 

 

Грамматика G', которую строит рассматриваемый алгоритм, не содер-

жит бесполезных символов.

·· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

3.10.2.4.Алгоритм преобразования в грамматику без e-правил

В практике построения трансляторов обычно правила A e бессмыс-

ленны. Очень полезно отработать метод устранения таких правил из грамма-

тики.

98

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Назовем КС-грамматику G = (N, Σ, P, S) грамматикой без e-правил (или неукорачивающей), если либо P не содержит e-

правил, либо есть точно одно правило S e и S не встречается в правых частях остальных правил из P.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Алгоритм устранения e-правил:

Вход. КС-грамматика G = (N, Σ, P, S).

Выход. Эквивалентная КС-грамматика G' = (N', Σ', P', S') без e-правил.

Метод:

1)Построить Ne = {A | A N и A +G e}.

2)Построить P' следующим образом:

а) если A α0B1α1B2α2Bkαk принадлежит P, k 0 и для 1 i k, но ни один символ в цепочках αj (0 j k) не принадлежит Ne, то включить в P' все правила вида

A α0X1α1X2…αk–1Xkαk,

где Xi – либо Bi, либо e, но не включает правило A e (хотя это могло бы произойти в случае, если все αi были равны e);

б) если S Ne, включить в P' правила S' e | S, где S' – новый сим-

вол, и положить N' = N{S'}, в противном случае положить N' = N и S' = S.

3)Положить G' = (N', Σ', P', S').

· · · · · · · · · · · · · · · · · · · · · · · ·

 

Пример · · · · · · · · · · · · · · · · · · · · · · ·

 

 

 

Рассмотрим грамматику S aSbS | bSaS | e. Применяя к ней рассмот-

ренный алгоритм, получаем грамматику

S' S | e

99

S аSbS | bSaS | aSb | abS | ab | bSa | baS | ba.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

3.10.2.5. Алгоритм устранения цепных правил

Другое полезное преобразование грамматик – устранение правил вида

A B, которые мы будем называть цепными.

Вход. КС-грамматика G = (N, Σ, P, S) без e-правил.

Выход. Эквивалентная КС-грамматика G' = (N', Σ', P', S) без e-правил и цепных правил.

Метод:

1)Для каждого A N построить NA = {B | A * B} следующим образом:

а) положить N0 = {A} и i = 1;

б) положить Ni = {C | B C принадлежит P и B Ni–1}Ni–1;

в) если Ni Ni–1, то положить i = i+1 и повторить шаг б), в против-

ном случае положить NA = Ni.

2)Построить P' следующим образом: если B α принадлежит P и не является цепным правилом, включать в P' правило A α для таких

A, что B NA.

3)Положить G' = (N', Σ', P', S).

· · · · · · · · · · · · · · · · · · · · · · · ·

 

Пример · · · · · · · · · · · · · · · · · · · · · · ·

 

 

 

Грамматика с правилами:

EE+T | T

TT*F | F

F(E) | a

Применим к данной грамматике рассмотренный выше алгоритм. На шаге 1) NE = {E, T, F}, NT = {T, F}, NF = {F}. После шага 2) множество P' ста-

нет таким: