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

 

93

 

E

E

T

 

+

T

F

F

a

a

Рисунок 3.9 – Пример дерева вывода

Это дерево служит представлением десяти эквивалентных выводов це-

почки a + a:

левый вывод E E + T T + T F + T a + T a + F a + a;

правый вывод E E + T E + F E + a T + a F + a a + a.

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

Цепочку α будем называть левовыводимой, если существует левый вы-

вод S = α1, α2, …, αn = α, и писать S l* α. Аналогично, α будем называть

правовыводимой, если существует правый вывод S = α1, α2, …, αn = α, и пи-

сать S r* α. Один шаг левого вывода будем обозначать l, а правого – r.

3.10.2 ПРЕОБРАЗОВАНИЕ КС-ГРАММАТИК

КС-грамматику часто требуется модифицировать так, чтобы порожда-

емые ею языки приобрели нужную структуру.

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

 

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

 

 

 

Рассмотрим, например, язык L(G0). Этот язык порождается граммати-

кой G с правилами

E E+E | E*E | (E) | a.

94

Но эта грамматика имеет два недостатка. Прежде всего, она неодно-

значна из-за наличия правила E E+E | E*E. Эту неоднозначность можно устранить, взяв вместо G грамматику G1 с правилами

E E+T | E*T | T T (E) | a.

Другой недостаток грамматики G, которым обладает и грамматика G1,

заключается в том, что операции «+» и «*» имеют один и тот же приоритет.

То есть структура выражения a+a*a и a*a+a, которую мы придаем граммати-

ке G1, подразумевает тот же порядок выполнения операций, что и в выраже-

ниях (a+a)*a и (a*a)+a соответственно.

Чтобы получить обычный приоритет операций «+» и «*», при которых

«*» предшествует «+» и выражение a+a*a понимается как a+(a*a), надо пе-

рейти к грамматике G0.

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

Общего алгоритмического метода, который придавал бы данному язы-

ку произвольную структуру, не существует. Но с помощью ряда преобразо-

ваний можно видоизменить грамматику, не испортив порождаемый ею язык.

Начнем с очевидных, но важных преобразований.

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

 

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

 

 

 

Например, в грамматике G = ({S, A}, {a, b}, P, S), где P ={S a, A b},

нетерминал A и терминал b не могут появляться ни в какой выводимой це-

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

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

95

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

Назовем символ X(N Σ) бесполезным в КС-грамматике

G = (N, Σ, P, S), если в ней нет вывода вида S * wXy * wxy, где w, x и y принадлежат Σ*.

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

Чтобы установить, бесполезен ли нетерминал A, построим сначала ал-

горитм, выясняющий, может ли этот нетерминал порождать какие-либо не-

терминальные цепочки, т.е. алгоритм, решающий проблему пустоты множе-

ства {w | A * w, w Σ*}.

3.10.2.1. Алгоритм проверки пустоты языка

Алгоритм: Не пуст ли язык L(G)?

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

Выход. «ДА» если L(G) , «НЕТ» в противном случае.

Метод. Строим множества N0, N1, … рекурсивно.

1.Положить N0 = , i = 1.

2.Положить Ni = {A | A α P и α(Ni–1 Σ)*}Ni–1.

3.Если Ni Ni–1, то положить i = i+1 и перейти к шагу 2), в противном случае – Ne = Ni.

4.если S Ne, то выдать вывод «ДА», в противном случае – «НЕТ».

Так как символ Ne N, то алгоритм должен остановиться максимум по-

сле n+1 повторения шага 2).

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

Алгоритм, приведенный выше, говорит «ДА» тогда и толь-

ко тогда, когда S * w для некоторой цепочки w Σ*.

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

96

3.10.2.2. Алгоритм устранения недостижимых символов

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

Символ X(N Σ) назовем недостижимым в КС-

грамматике G = (N, Σ, P, S), если X не появляется ни в одной вы-

водимой цепочке.

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

Недостижимые символы можно устранить из КС-грамматики с помо-

щью следующего алгоритма.

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

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

1.L(G') = L(G);

2.для всех X(N' Σ') существуют такие цепочки α и β из (N' Σ')*, что

S *G' αXβ.

Метод:

1)Положить V0 = {S} и i = 1.

2)Положить Vi = {X | в P есть A αXβ и A Vi–1}Vi–1.

3)Если Vi Vi–1, положить i = i+1 и перейти к шагу 2), в противном случае, пусть

N' = Vi N,

Σ' = Vi Σ,

P' состоит из правил множества P, содержащих только символы из

Vi,

G' = (N', Σ', P', S).

Заметим, что шаг 2) алгоритма можно повторить только конечное число раз, т.к. Vi N Σ.