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

Выделение нетерминала

Преобразование, обратное замене, назовём выделением нетерминала.

Если грамматика содержит n правил вида Вi , где 1in, n правил Аi , где 1in и других правил с левой частью А нет, то n правил вида Вi , где 1in можно заменить одним правилом ВА .

Если грамматика содержит n правил вида Вi , где 1in, то их можно заменить одним правилом ВА , где А – новый нетерминал, и ввести n правил Аi , где 1in.

Если в правых частях правил грамматики встречается цепочка  , то её можно заменить на новый нетерминал А и ввести правило А.

Левая факторизация

Особым случаем выделения нетерминала является левая факториза-ция.

Если n2 правил грамматики имеют одинаковые левые части, допустим нетерминал А, и правые части начинаются одним или несколькими одинаковыми символами (имеют общий префикс ), т.е. i-ое правило имеет вид Аi, где 1in, то можно общий префикс  вынести в отдельное правило АВ, где В – новый нетерминал, и добавить n правил вида Вi, где 1in. Такое преобразование называется левой факторизацией. Результат применения левой факторизации неоднозначный, зависит от выбора префикса, выносимого в отдельное правило (например, в качестве префикса можно взять один символ или общий префикс наибольшей длины) и количества правил, участвующих в факторизации.

Пример 1.

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

Первый шаг

Второй шаг

SabBa

SabBb

SabA

BbB

Bb

Aa

SabC

CBa

CBb

CA

BbD

DB

D

Aa

SabC

CBE

CA

Ea

Eb

BbD

DB

D

Aa

Пример 2.

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

Первый шаг

Второй шаг

SabBa

SabBb

SabA

BbB

Bb

Aa

SabBE

SabA

Ea

Eb

BbD

DB

D

Aa

SabC

CBE

CA

Ea

Eb

BbD

DB

D

Aa

Пример 3.

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

Первый шаг

Второй шаг

Третий шаг

SabBa

SabBb

SabA

BbB

Bb

Aa

SaC

CbBa

CbBb

CbA

BbD

DB

D

Aa

SaC

CbE

EBa

EBb

EA

BbD

DB

D

Aa

SaC

CbE

EBF

EA

Fa

Fb

BbD

DB

D

Aa

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

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

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, выполнить замену края (новые правила необходимо учитывать при выполнении п.3).

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

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

Пример.

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

А1А1аА3

А1А2b

А2А1c

А2А3a

А3А1b

А3c

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

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

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

А1А2bB1

А2А1c

А2А3a

А3А1b

А3c

B1аА3B1

B1

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

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

А1А2bB1

А2А2bB1c

А2А3a

А3А1b

А3c

B1аА3B1

B1

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

А1А2bB1

А2А3aB2

А3А1b

А3c

B1аА3B1

B1

B2bB1cB2

B2

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

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

А1А2bB1

А2А3aB2

А3А2bB1b

А3c

B1аА3B1

B1

B2bB1cB2

B2

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

А2А3aB2

А3 А3aB2bB1b

А3c

B1аА3B1

B1

B2bB1cB2

B2

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

А1А2bB1

А2А3aB2

А3cB3

B1аА3B1

B1

B2bB1cB2

B2

B3aB2bB1bB3

B3

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

А1 cB3aB2bB1

А3cB3

B1аcB3B1

B1

B2bB1cB2

B2

B3aB2bB1bB3

B3

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