Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Дискретная математика.doc
Скачиваний:
123
Добавлен:
10.05.2014
Размер:
905.22 Кб
Скачать

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RB 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), существует эквивалентная грамматика с единственным укорачивающим правилом.