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

100

EE+T | T*F | (E) | a

TT*F | (E) | a

F(E) | a

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

3.10.3 ГРАММАТИКА БЕЗ ЦИКЛОВ

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

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

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

Большинство (если не все) языков программирования обладают именно этими свойствами.

3.10.4 НОРМАЛЬНАЯ ФОРМА ХОМСКОГО

КС-грамматика G = (N, Σ, P, S) называется грамматикой в нормальной форме Хомского (или бинарной нормальной форме), если каждое правило

из P имеет один из следующих видов [3, 6]:

1)A BC, где A, B, C принадлежит N;

2)A a, где a Σ;

3)S e, если e L(G), причем S не встречается в правых частях

правил.

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

Аврам Ноам (Наум) Хомский – лингвист, автор работ о по-

рождающих грамматиках и классификации формальных языков,

называемой иерархией Хомского.

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

101

На практике каждый КС-язык порождается грамматикой в нормальной форме Хомского. Это очень полезно, когда требуется простая форма пред-

ставления КС-языка.

Алгоритм преобразования к нормальной форме Хомского:

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

Выход. Эквивалентная КС-грамматика G' в нормальной форме Хомско-

го, т.е. L(G') = L(G).

Метод. Грамматика G' строится следующим образом:

1)Включить в P' каждое правило из P вида A a.

2)Включить в P' каждое правило из P вида A BC.

3)Включить в P' каждое правило S e, если оно было в P.

4)Для каждого правила из P вида A X1X2Xk, где k > 2, включить в

P' правила

A X'1 X2XkX2Xk X'2 X3Xk

…………………………

Xk–2Xk–1Xk X'k–2 Xk–1XkXk–1Xk X'k–1X'k,

где X'i = Xi, если Xi N; X'i – новый нетерминал, если Xi Σ; XiXk

новый терминал.

5)Для каждого правила из P вида A X1X2, где хотя бы один из сим-

волов X1 и X2 принадлежит Σ, включить в P' правило A X'1X'2.

6)Для каждого нетерминала вида A', введенного на шагах 4) и 5),

включить в P' правило A' a. Наконец, пусть N' – это N вместе со всеми нетерминалами, введенными при построении P'. Тогда иско-

мая грамматика G = (N', Σ', P', S).

 

102

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

 

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

 

 

 

 

Пусть G – приведенная грамматика, определенная правилами:

S aAB | BA A BBB | a B AS | b

Строим P' рассмотренным выше алгоритмом, сохраняя правила S BA, A a, B AS и B b. Заменяем правило S aAB на S A' AB и AB

AB, а A BBB – правилами A B BB и BB BB. Наконец, добавляем

A' a. В результате получим грамматику G' = (N', {a, b}, P', S) и P', состоя-

щую из правил:

S A' AB | BA A B BB | a B AS | b

AB AB

BB BB A' a

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

3.10.5 НОРМАЛЬНАЯ ФОРМА ГРЕЙБАХ

Очень важно для языков программирования использовать грамматику,

в которой все правые части правил начинаются с терминалов. Построение та-

ких грамматик связано с устранением любой рекурсии [3].

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

Нетерминал A в КС-грамматике G = (N, Σ, P, S) называет-

ся рекурсивным, если A + αAβ для некоторых α и β. Если α = e,

103

то A называется леворекурсивным. Аналогично, если β = e, то A

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

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

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

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

ется и праворекурсивная грамматика. Грамматика, в которой все нетерминалы, кроме, может быть, начального символа, ре-

курсивные, называется рекурсивной грамматикой.

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

Практически все языки программирования определяются нелеворекурсивной грамматикой. Поэтому все элементы левой рекурсии должны быть устранены из грамматики.

Пусть G = (N, Σ, P, S) – КС-грамматика, в которой

A Aα1 | Aα2 | … | Aαm | β1 | β2 | … | βn,

т.е. все правила из P вида Aαi содержат левую рекурсию, и ни одна из цепо-

чек βi не начинается с A.

Если грамматика G' = (N{A'}, Σ, P', S), где A' – новый нетерминал, а P'

получено из P заменой A-правил правилами:

A β1 | β2 | … | βn | β1A' | β2A' | … | βnA' |, A' α1 | α2 | … | αm | α1A' | α2A' | … | αmA',

то L(G') = L(G).

Рассмотрим на графе, как реализуется вышесказанное (рис. 3.10).

 

 

 

104

 

 

 

A

 

A

 

 

A

αi1

βj

A'

 

A

αi2

αi4

A'

A

αi3

 

αi3

A'

 

αi4

 

 

αi2

βj

 

 

 

 

αi1

Рисунок 3.10 – Леволинейная и праволинейная и грамматики

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

 

 

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

 

 

 

 

 

 

 

 

Пусть G0 – наша обычная грамматика с правилами:

EE+T | T

TT*F | F

F(E) | a

Применяя к ней вышерассмотренную лемму, получаем эквивалентную грамматику с правилами:

E T | TE'

E' +T | + TE'

T F | FT'

T' *F | *FT' F (E) | a

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

На основании вышеописанного построим алгоритм устранения левой рекурсии. Он будет подобен алгоритму решения уравнения с регулярными коэффициентами.

Алгоритм устранения левой рекурсии:

105

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

Выход. Эквивалентная КС-грамматика без левой рекурсии.

Метод:

1)Пусть N = {A1, A2, …, An}. Преобразуем G так, чтобы в правиле

Ai α цепочка α начиналась либо с терминала, либо с такого Aj, что i > j. С этой целью положим i = 1.

2)Во множестве правил Ai Aiαi | … | Aiαm | β1 | … | βp, где ни одна из цепочек βi не начинается с Ak, если k i, заменим Ai-правила прави-

лами:

Ai = β1 | … | βp | β1Ai' | … | βnAi' |, Ai' = α1 | … | αm | α1Ai' … | αmAi',

где Ai' – новый нетерминал. Правые части всех Ai-правил начинают-

ся теперь с терминала или с Ak, для которого k > i.

3)Если i = n, то полученную грамматику считаем результатом и оста-

навливаемся, в противном случае i = i+1 и j = 1.

4)Заменим каждое правило Ai Ajα правилами Ai β1α | … | βmα, где

Aj β1 | … | βm для всех Aj-правил. Так как правая часть каждого Aj-

правила начинается уже с терминала или Ak для k > j, то правая часть каждого Ai-правила будет теперь обладать этими свойствами.

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

и перейти к шагу 4).

На основании вышесказанного можно однозначно доказать теорему,

что каждый КС-язык определяется нелеворекурсивной грамматикой.

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

КС-грамматика G = (N, Σ, P, S) называется грамматикой в форме Грейбах, если в ней нет e-правил и каждое правило из P,

отличное от S e, имеет вид A aα, где a Σ, α N*.

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