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

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

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

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

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

  1. Записать все правила для нетерминала X, имеющие одинаковые префиксы   , в виде одного правила с альтернативами (вариантами):

X 1|2|…|n| , 1, 2, …,n  

  1. Вынести за скобки влево префикс  каждой строки-альтернативы:

X (1| 2|…| n|) , 1, 2, …,n  

  1. Обозначить новым нетерминалом Y выражение, оставшееся в скобках:

X Y, Y 1| 2|…| n

  1. Пополнить множество нетерминалов новым нетерминалом Y и заменить правила, подвергшиеся факторизации, новыми правилами для X и Y.

  2. Повторить п.1-4 для всех нетерминалов грамматики, для которых это возможно и нобходимо.

Пример. Ниже показана левая факторизация правил

1) SaSb 2) SaSc 3) Sd грамматики G=({S}, {a, b, c}, P, S)

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

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

1

SaSb |aSc

2

SaS(b |c)

3

SaSW W b |c

4

G’=({S, W}, {a, b, c}, P’, S) P’={ SaSW Sd W b |c }

5

Других объектов факторизации нет

Пример. Выполнить левую факторизацию правил КС-грамматики

1) SabSa 2) SaaAb 3) Sb 4) AbaAb 5) Ab грамматики G=({S,A}, {a, b}, P, S)

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

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

1

SabSa| aaAb

2

Sa(bSa| aAb)

3

SaW Sb WbSa W aAb

4

AbaAb |b

5

Ab(aAb |)

6

AbZ Z aAb Z 

7

Грамматика после левой факторизации имеет вид:

G’=({S, A, W, Z}, {a, b}, P’, S) P’={ SaW Sb WbSa W aAb, AbZ Z aAb Z }, S)

8

Других объектов факторизации нет

9.4 Преобразование к нормальной форме Хомского

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

    1. АВС, где А, В, С N;

    2. Аa, где а Т;

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

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

Примечание: КС-грамматика обладает свойствами приведенной грамматики, если она не имеет циклов, -правил и бесполезных символов. Отсутствие циклов означает, что в грамматике невозможны выводы вида А+А, где А  N.

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

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

    1. Включить в P’ каждое правило вида 2, т.е. (Аa )  Р;

    2. Включить в P’ каждое правило вида 1, т.е. (АВС)  Р;

    3. Включить в P’ каждое правило вида 3, т.е. (S)  Р (если оно есть в Р);

    4. Для каждого правила (АX1…Xk)  Р, где k>2, включить в P’ правила:

АX1’<X2…Xk>

<X2…Xk> X2’<X3…Xk>

. . .

<Xk-2 Xk-1Xk> Xk-2’< Xk-1Xk>

< Xk-1Xk> Xk-1’X’k

г де <Xi…Xk> - новый нетерминал

Xi , если Xi N

Xi’= X’i , если Xi T

    1. Для каждого правила (АX1X2)  Р, где хотя бы один из символов X1 и X2 является терминалом, включить в P’ согласно обозначениям правило (АX’1X’2)

    2. Для каждого нового нетерминала вида X’, введенного в п.4 или в п.5, согласно обозначениям, включить в P’ правило X’X, где XT

    3. Пополнить множество нетерминалов V’N = V’ {новые нетерминалы}

При реализации алгоритма полезно иметь таблицу для обозначения терминалов и таблицу для обозначения строк из двух и более символов.

Пример. Преобразование в НФХ грамматики с правилами

SaAВ | BA

АВBB|a

BAS|b

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

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

1

P’={ Аa, B|b}

2

P’={ Аa, B|b}  { S BA , BAS }

3

Правила S нет

4

1) SaAВ

Терминал а обозначаем N1

Строка АВ обозначаем N2

Новые правила: S N1 N2 , N2 АВ

2) АВВВ

Строка ВВ обозначаем N3

Новые правила: А ВN3 , N3 ВВ

5

Таких правил нет

6

Правило N1 а помещаем в P’:

{ S N1 N2 | ВА , А ВN3| a, BAS| b, N2 АВ, N3 ВВ}  { N1 а }

7

N’=N{обозначения терминалов и строк}={S, A, B, N1, N2 , N3}