Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОБЗОРНАЯ ЛЕКЦИЯ ПО КУРСУ ЯП и МТ.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
141.53 Кб
Скачать
  1. Эквивалентные преобразования кс-грамматик

9.1 Устранение цепных правил

Цепное правило – это правило вида АВ, где А,В  N. Цепные правила могут быть причиной нежелательных свойств грамматики, таких, например, как циклы. Алгоритм устранения цепных правил осуществляет замещение правой части каждого цепного правила, используя для этого не цепные правила.

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

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

1. Для каждого нетерминала А вычислить NA = {B | A*B, где B N }:

    1. Положить N0A={A}

    2. Вычислить N1A = N0A {C | (BC)  P, B  N0A , C  N }

    3. Если N1A  N0A , то положить N0A = N1A и перейти к п.1.2, иначе положить NA = N1A

2. Построить множество P’ так: если (В)  P не является цепным правилом (  N), то включить в P’ правило А для каждого А, такого, что В  NA, т.е.

P’={ А для всех (В)  P , где   N и В  NA }

Пример: Преобразовать грамматику G с правилами:

G: S X

X Y

YY; | z

в эквивалентную грамматику без цепных правил:

Шаг алгоритма

Действия и результаты

1.1

N0S = {S}

1.2

N1S = {S, X}

1.3

N1S = N0S ? Нет N0S = N1S={S, X}

1.2

N1S = {S, X, Y}

1.3

N1S = N0S ? Нет N0S = N1S={S, X,Y}

1.2

N1S = {S, X, Y}

1.3

N1S = N0S ? Да NS ={S, X,Y}

1.1

N0X = {X}

1.2

N1X = {X,Y}

1.3

N1X = N0X ? Нет N0X = N1X={X, Y}

1.2

N1X = {X,Y}

1.3

N1X = N0X ? Да NX ={X,Y}

1.1

N0Y = {Y}

1.2

N1Y = {Y}

1.3

N1Y = N0Y ? Да NY ={Y}

2

P’={SY;|z, XY; |z , YY; |z}

Пример: Преобразовать грамматику G с правилами:

G: E E+T

ET

TT*P

TP

Pi

P(E)

  1. После выполнения шага 1 алгоритма получаем: NE ={E, T, P}, NT ={T, P}, NP ={P}

  2. Выберем первый нетерминал E из множества NE. Формируя множество правил , левая часть которых - нетерминальный символ Е, а правые части нецепных правил исходной грамматики, в левой части которых находятся символы из множества NE, получаем: { E E+T , ET*P, Ei, E(E)}. Таким же образом рассматриваем остальные символы из NE, затем символы из NT и NP .

  3. Окончательно получаем P’={ E E+T , ET*P, Ei, E(E), TT*P, Ti, T(E), Pi, P(E)}

    1. Удаление произвольного правила

Рассмотрим еще одно полезное преобразование грамматик – удаление произвольного правила вывода. Такое преобразование часто используется при приведении грамматики к заданному классу.

Алгоритм. Удаление произвольного правила вывода из Кс-грамматики

Вход: КС-грамматика G=(N, T, P, S) и правило вывода вида АВ  Р, где А, В  N и цепочки ,   (ТN)*.

Выход: КС-грамматика G'=(N, T, P’, S): L(G)=L(G’) и АВ  Р'.

Описание алгоритма:

  1. Пусть B1, B2, … Bk – все В-правила грамматики G. Построить P’ следующим образом:

P’=( P-{ АВ})  {А1 |2, … | k }

  1. Положить G'=(N, T, P’, S)

Пример. Удалить правило P(E) из КС-грамматики с правилами:

E E+T

ET

TT*P

TP

Pi

P(E)

1. Е-правила грамматики G будут выглядеть следующим образом:

E E+T

ET

2. Из множества правил грамматики G необходимо удалить заданное правило P(E) и добавить P-правила: P (E+T) P(T). Новое множество правил грамматики P' имеет вид: { E E+T ET TT*P TP Pi P (E+T) P(T) }