Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
TYaP_posobie.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
951.3 Кб
Скачать

Устранение правой рекурсии

Правило А называется рекурсивным, если существует вывод *А . Если  и =, то правило А называется праворекурсивным. Правило называется самоправорекурсивным, если его самый правый символ нетерминал и он совпадает с левой частью. Самоправорекурсивное правило также является и праворекурсивным.

1. Исключение самоправорекурсивных правил.

Предположим, что нетерминал А имеет m самоправорекурсивных правил А i А, где 1im, и n правил А j , где 1jn, которые не являются самоправорекурсивными и других правил с левой частью А нет. Эти правила заменяются следующими:

АВ j, где 1jn, В – новый нетерминал,

ВВ i, где 1im,

В

2. Исключение праворекурсивных правил.

Алгоритм исключения праворекурсивных правил.

1. Обозначить нетерминалы грамматики А1, А2,…,Аn, где n – количество нетерминалов.

2. Для каждого нетерминала грамматики Аi, где 1in, выполнить п.3 и 4.

3. Для каждого правила вида АiАj, где 1ji-1, выполнить замену нетерминала Аj (новые правила необходимо учитывать при выполнении п.3).

4. Исключить самоправорекурсивные правила для нетерминала Аi (новые нетерминалы далее не рассматривать).

Алгоритм применим, если грамматика не имеет циклов (цепных правил) и -правил. Цепные правила и -правила могут быть удалены предварительно. Получающаяся грамматика без правой рекурсии может иметь -правила.

Пример.

Устранить правую рекурсию в грамматике:

А1аА3А1

А1bА2

А2cА1

А2aА3

А3bА1

А3c

Рассматриваем нетерминал А1.

Правил вида А1А0 в грамматике нет, т.к. нет нетерминала А0, поэтому замену нетерминала А1 (п.3) не выполняем.

Исключаем самоправорекурсивное правило А1аА3А1 , получаем грамматику:

А1 В12

А2cА1

А2aА3

А3bА1

А3c

B1В1аА3

B1

Рассматриваем нетерминал А2.

Выполняем замену нетерминала А1 в правиле А2сА1 , получаем грамматику:

А1 В12

А2cВ12

А2aА3

А3bА1

А3c

B1В1аА3

B1

Исключаем самоправорекурсивное правило А2cВ12 , получаем грамматику:

А1 В12

А2 В23

А3bА1

А3c

B1В1аА3

B1

B2В21b

B2

Рассматриваем нетерминал А3.

Выполняем замену нетерминала А1 в правиле А3bА1 , получаем грамматику:

А1 В12

А2 В23

А3bВ12

А3c

B1В1аА3

B1

B2В21b

B2

Выполняем замену нетерминала А2 в правиле А3bВ12 , получаем грамматику:

А1 В12

А2 В23

А3bВ123

А3c

B1В1аА3

B1

B2В21b

B2

Исключаем самоправорекурсивное правило А3bВ123, получаем грамматику:

А1 В12

А2 В23

А3B3c

B1В1аА3

B1

B2В21b

B2

B3В312a

B3

Грамматика без праворекурсивных правил получена. Далее можем выполнить две одиночные замены и получим грамматику:

А1 В12aB3c

B1В1аB3c

B1

B2В21b

B2

B3В312a

B3

Нормальная форма Хомского

Любой КС язык может быть задан КС-грамматикой в нормальной форме Хомского (НФХ), а любую КС-грамматику можно преобразовать в эквивалентную ей грамматику в НФХ.

Грамматика в НФХ содержит только правила трёх видов:

1) АВС , где А, В, С – нетерминалы;

2) Аt , где t – терминал;

3) S , если пустая цепочка принадлежит языку, причём начальный нетерминал S не встречается в правых частях правил.

Другими словами, это грамматика без -правил, а правые части правил содержат либо два нетерминала, либо один терминал.

Для преобразования произвольной грамматики в НФХ предварительно нужно устранить лишние символы, -правила и цепные правила, т.е. привести грамматику.

Алгоритм преобразования приведённой грамматики в НФХ.

1. Для каждого правила вида АХ, где А – нетерминал, Х – терминал или нетерминал,  - цепочка терминалов или нетерминалов, содержащая более одного символа, выполнить следующее преобразование:

если в грамматике есть одиночное правило С, то

правило АХ заменить на АХС, иначе ввести

правило N , где N – новый нетерминал, и правило

АХ заменить на АХN .

При выполнении п.1 учитывать вводимые правила.

В результате выполнения п.1 получим грамматику, правые части правил котрой содержат не более двух символов.

2. Для каждого правила вида АtB, где А, B – нетерминалы, t – терминал, выполнить следующее преобразование:

если в грамматике есть одиночное правило Сt, то

правило АtB заменить на АСB, иначе ввести

правило Nt , где N – новый нетерминал, и правило

АtB заменить на АNB .

3. Для каждого правила вида АBt, где А, B – нетерминалы, t – терминал, выполнить следующее преобразование:

если в грамматике есть одиночное правило Сt, то

правило АBt заменить на АBС, иначе ввести

правило Nt , где N – новый нетерминал, и правило

АBt заменить на АBN .

Пример.

Преобразовать заданную грамматику в НФХ.

Исходная грамматика

Пункт 1 алгоритма

Пункты 2 и 3 алгоритма

АaBCd

АaN1

АaN1

А N2N1

АCd

N1BCd

N1BA

N2a

BaB

АCd

АCd

N1BA

Bb

BaB

BaB

АCN3

CABA

Bb

Bb

N3d

CABA

CAN1

B N2B

Bb

CAN1

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]