1. Алфавит, слова, операции над словами

Вид материалаДокументы

Содержание


9. Преобразования грамматик.
Подобный материал:
1   ...   6   7   8   9   10   11   12   13   14

9. Преобразования грамматик.


В данном разделе приводятся такие преобразования грамматик, которые не выводят нас из класса эквивалентности, т.е. грамматика G1 таким образом преобразуется в грамматику G2, чтобы L(G1)=L(G2).

9.1 Устранение непроизводящих правил.

Непроизводящими правилами грамматики начинаются правила, применение которых никогда не приводит к построению терминальных цепочек.

Например, рассмотри правила для нетерминала А

АА А В А

В этом случае, появившись в цепочке, нетерминал А никогда не будет заменен терминальной цепочкой (имеется в виду, что других правил для А нет). Естественно, в реальности ситуации бывают не столь простые. Алгоритм устранения непроизводящих нетерминалов:
  1. Построение множества производящих нетерминалов NR:
    1. Строится множество NR1 = {A/ Aj,jVT}
    2. Последовательно строятся множества NRi+1={ A/ Aj,j(NRiVT)*} до тех пор, пока получим NRi+1= NRi или же NRi= VN. Тогда NR = NRi.
  2. Исключаем из грамматики все правила, в правых частях которых нетерминалы из VN\ NR.
  3. Исключаем из грамматики правые части правил, в которых присутствуют нетерминалы из VN\ NR.

Например, рассмотрим грамматику G с множеством правил

S ABBC

A AAAB

B bBa

СсСd AC

Построим множество NR. NR1={B,C}, NR2={S, B, C}, NR3= NR2= NR.

Преобразованная грамматика примет вид:

S BC

B bBa

СсСd

9.2. Устранение недостижимых нетерминалов.

Недостижимыми нетерминалами называются нетерминалы, которые никогда не могут быть построены при построении вывода, начиная с начального символа грамматики. Следует отметить, что такие нетерминалы в грамматиках встречаются в основном тогда, когда исключены некоторые непроизводящие символы, т.е. недостижимым нетерминал становится чаще всего после исключения некоторых непроизводящих симовлов. Например, если в грамматике для нетерминала А правила АА А В А, и нетерминал В не встречается в других правых частях правил грамматики, то в этом случае, после устранения нетерминала А нетерминал В становится недостижимым, и, следовательно, его можно исключить из грамматики без изменения порождаемого ей языка. Построение множества недостижимых нетерминалов похоже на построение множества непроизводящих нетерминалов: мы строим множество всех достижимых нетерминалов, а затем исключаем все остальные нетерминалы грамматики. Алгоритм построения грамматики, в которой используются только достижимые нетерминалы (множество достижимых нетерминалов –D) , выглядит следующим образом:

Пусть дана грамматика G=< VT,VN, S, R>, строится эквивалентная грамматика без непроизводящих символов G’ =< VT,VN’, S, R’>.
  1. Начальное значение D0=S.
  2. Итерационное построение множества D: Di+1= Di{A/BARB Di}
  3. Построение продолжается, до тех пор, пока Di+1= Di или Di+1= VN, в обоих случаях VN’= Di+1,

R’={ Ri / Ri=(A), A VN’,( VN’ VT)*}

Построенная грамматика не содержит недостижимых нетерминалов.

Например, рассмотрим грамматику G с множеством правил

S A C B C

A AD DF

D aA  D A

F b F

B bBa

СсСd

Тогда здесь A и D непроизводящие нетерминалы, после их устранения нетерминал F становится недостижимым, поэтому нетерминалы A, D и F могут быть исключены из грамматики с сохранением языка, порождаемого грамматикой.

9.3. Устранение - правил

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

Пусть дана грамматика G=< VT,VN, S, R>, строится эквивалентная грамматика G’ =< VT,VN’, S, R’>.
  1. Построить множество N = { A / A +  } - множество нетерминальных символов, из которых возможен вывод пустой цепочки. Множество N строится итерационно. На первом шаге строится N0.

N0 = { B / B    R}

Пусть построено N1, N2, ..., Ni , ( i  0). Тогда Ni+1 = Ni { B / B    R &   ( Ni)* }.

Если на очередном шаге Ni+1 = Ni, то искомое множество N найдено ( N = Ni ).
  1. Построить R’ — множество правил эквивалентной грам­матики так, что:



    1. Если A0 B1 1 B2 ... Bk k  R , k  0 и Bi  N для 0  i  k, но ни один символ в цепочках j, 1  j  k не содержит символа из N, то включить в R’ все правила вида

A  0X11X2...Xkk

Xi либо Bi, либо (при этом правило A   не вклю­чать; это могло бы произойти, если все i =  ).
    1. если S  N, включить в R’ также правило S’ S где S’ - новый начальный символ.

Таким образом, любая КС—грамматика может быть приве­дена к виду, когда R не содержит -правил, либо есть точно одно правило S’   и S’ не встречается в правых частях остальных правил из R. Такие грамматики будем называть неукорачивающими.

Например, пусть дана грамматика G с множеством правил




SA B BC

A aAb 

B dBc

C CCAc

N0= {A, C}

N1= {A, C}= N. Поскольку L(G) (S N), правила грамматики примут вид




SA B B BC

A aAb ab

B dBc

C CCAca c


Б . Устранение правил А  В (цепных правил)

Применение цепных правил приводит к увеличению длины ветвей синтаксического дерева, исключение цепных правил часто приводит к большей «прозрачности» грамматики и уменьшению длины выводов, которые можно построить. Алгоритм исключения цепных правил:

1. Для каждого A VN построить NA = { B / A  B }, т.е. множество нетерминальных символов, выводимых из данного символа. Процедура построения следующая:

а) положить NA0 ={A}.

б) пусть построены NA0, NA1 ... NAi . Тогда

NAi+1 = { C / B  C  R & B  NAi }  NA0.

Если на очередном шаге NAi+1 = NAi, то положить NA = NAi.

2. Построить R’ (множество правил эквивалентной грамматики) так: если B    R и не является цепным правилом, то включить в R’ правила A  . для всех таких A, что

B  NA.

Рассмотрим пример. Пусть множество правил грамматики имеет вид:

ST+ST

T MTM

M (S) i

Простроим для данной грамматики множества NA

NS ={S, T, M}

NT = {T, M}

NM = {M}

После преобразования грамматики она примет вид:

ST+S MT(S) i

T MT (S) i

M (S) i

В данном случае преобразование грамматики не привело к её упрощению, но построенные синтаксические деревья будут иметь меньшую глубину, и построение дерева будет происходить быстрее.

Грамматика называется неукорачивающей, если для любого правила грамматики  выполняется. Такое определение применимо как к КС-грамматикам, так и к КЗ-грамматикам. А-грамматика так же может быть неукорачивающей. Для КС и А-грамматик необходимым и достаточным условием принадлежности к классу неукорачивающих грамматик является отсутствие в них -правил.

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

Поэтому, если L(G), то существует приведенная грамматика G1, такая, что L(G1)=L(G).

В случае же L(G), существует эквивалентная грамматика с единственным укорачивающим правилом.