Тема 3: Эквивалентные преобразования грамматик.
Преобразования автоматных грамматик к вполне детерминированной форме.
Исключение тупиковых правил.
Обобщённые КС-грамматики. Приведение грамматик к удлиняющей форме.
Декомпозиция правил КС-грамматик.
Устранение левой рекурсии. Левая факторизация.
Преобразования автоматных грамматик к вполне детерминированной форме.
Две грамматики называются эквивалентными, если они порождают один и тот же язык. Как факт, примем следующую теорему: не существует алгоритма, определяющего эквивалентность или неэквивалентность двух грамматик. Тем не менее, существуют преобразования, приводящие к эквивалентной грамматике. Критерием преобразования являются:
Приведение к детерминированной форме.
Устранение правил, не приводящих к терминальным цепочкам.
Уменьшение вывода за счёт увеличения количества правил и удаление пустых цепочек.
Теорема: для любой автоматной грамматики существует эквивалентная ей грамматика во вполне детерминированной форме.
Алгоритм приведения к детерминированной форме:
A a,F’: A aF’
Второй шаг аналогичен алгоритму приведения к детерминированной форме конечных автоматов.
Если в исходной грамматике имеется правило: «SaA1|…|aAn», то в результирующей грамматике добавляется правило вида: <S>a<A1…An>,AiaBj, <…Ai…>a<…Bj….>.
Процесс построения новых нетерминалов завершается после рассмотрения нетерминалов исходной грамматики и анализа всех вновь появившихся нетерминалов.
Если цепочка принадлежит языку, порождаемому одной грамматикой, она будет принадлежать и языку, порождаемому другой грамматикой:
a € L (G1); a € L (G2)
a € L (G2); a € L (G1)
a = a1…an.
Sa1Aa2…AanF.
<S>a1<A1>…<An>, a € L (G2).
Пример:
S aB|aC|bB|bS|c
B cC|c
CaS|a|c
Грамматика находится не во вполне детерминированной форме, так как имеются разветвления состояний.
Добавляем предконечное состояние:
S aB|aC|bB|bS|cF’
B cC|cF’
C aS|aF’|cF’
F’ ⊥F
Перевод:
<S> a<BC>|b<BS>|c<F’>
<B> c<CF’>
<C> a<SF’>|c<F’>
<F’> ⊥<F>
<BC> c<CF’>|a<SF’>
<BS> c<CF’>|a<BC>|b<BS>
<CF’> a<SF’>|c<F’>|⊥<F>
<SF’> a<BC>|b<BS>|c<F’>|⊥<F>
Переименовываем:
<S> - S
<F> - F
<F’> - F’
<BC> - A
<BS> - B
<CF’> - C
<SF’> - D
Решение:
S aA|bB|cF’
F’ ⊥F
A cC|aD
B cC|aA|bB
C aD|cF’|⊥F
D aA|bB|cF’|⊥F
Исключение тупиковых правил.
Правила, не приводящие к терминальным цепочкам, называются тупиковыми. Различают тупики внешнего типа, внешнего типа и циклические тупики внешнего и внутреннего типа.
Правила вида: «AaBb» называются тупиком внешнего типа, если не существует ни одного правила для нетерминалаB: «Bb1».
Правила вида: «Aj» называются тупиком внутреннего типа, если не существует ни одного правила для нетерминалаB: «BaAb», по которому можно попасть внутрьA.
B
A
S
C
F
AB– внешний тупик,CA– внутренний.
A0 a0A1b0
A1 a1A2b1 – циклический тупик.
Эта же совокупность правил называется циклическим тупиком внутреннего типа, если ни для одного Aiне существует правила, по которому в этот нетерминал можно попасть.
Теорема: для любой КС-грамматики существует эквивалентная ей грамматика беступиковых правил.
Для устранения тупиков циклического типа строится множество нетерминалов, не являющихся тупиками…
X0 = VT – множество нетерминалов.
X1= {A|Aa,a€X0} – терминалы, из которых можно получить нетерминальную цепочку не более чем за один шаг.
Xi= {A|Aa,a€X0vXk},k= 0…i,k€v- терминалы, из которых можно получить нетерминальную цепочку не более чем заi-шагов.
Так как множество нетерминалов любой грамматики конечное, то существует такой номер I, что на некотором шагеXI=XI+1;
Все нетерминалы, вошедшие в XI– «хорошие». Не вошедшие исключаются вместе с правилами, в которые они входят.
Для полученной грамматики выполняется второй шаг алгоритма, исключающий тупики внутреннего типа и циклические тупики внутреннего типа.
Y0= {S} – нетерминалS, «хороший».
Y1 = {A|S a, a € Y0}
… … … … …
Yi = {A|B aAф, B € v Yk}, k = 0…i-1, k € v
Yi– множество нетерминалов, в которые можно попасть не более чем заiшагов.
Все нетерминалы, не попавшие в YIявляются тупиками внутреннего типа или циклическими тупиками внутреннего типа, и из грамматики исключаются.
Пример:
SaA|cC|bD|qP|kT
A cC
C k
T m
D bT|fK
P cR
R dK
B dQ|m
Q pB|rB
Решение:
X0 = VT
X1 = {C,T,B}
X2= {C,T,B,S,A,D,Q} // входят только множества, в которых есть один или два нетерминала из предыдущих множеств (выше).
X3 = {C,T,B,S,A,D,Q}
Таким образом, вычёркиваем «qP» из 1 строчки, а также множестваP,RиK.
Y0 = {S}
Y1 = {S,A,C,D,T}
Y2 = {S,A,C,D,T}
B,Q– совокупность правил, составляющих циклический тупик внутреннего типа. Их из грамматики исключаем.
Получаем беступиковую грамматику.
Обобщённые КС-грамматики. Приведение грамматик к удлиняющей форме.
Правило вида Aε называются аннулирующими.
Грамматика с аннулирующими правилами является обобщённой.
Теорема: для любой обобщённой грамматики существует эквивалентная ей грамматика с не более чем одним обобщённым правилом.
Шаг 1: определение принадлежности пустой цепочки языку и построение множества нетерминалов, из которых за некоторое количество шагов можно получить пустую цепочку.
X0 = {ε}
X1 = {A|A ε}
Xi = {A|A a, a € v Xk}, k = 0…i-1, k € v
Если S€XI, то пустая цепочка принадлежит языку.
В таком случае Sзаменяется наS1и добавляется правило:SS1|ε.
Если в грамматике имеются правила вида: A0a0A1a1A2…Anan, то в грамматику добавляются следующие правила:
A0 a0a1A2…Anan,
A0 a0A1a1a2…Anan,
A0a0a1a2an, то есть рассматриваются все случаи исчезновения.
Aiε.
Пример: <число> <знак><целая часть>.<дробная часть>
<знак> +|-| ε
<целая часть> <целая часть><цифра>| ε
<дробная часть> <целая часть>
<цифра> 0|…|9
Решение:
X0= { ε }
X1= {<знак>,<целая часть>}
X2= {<знак>,<целая часть>,<дробная часть>}
X3= {<знак>,<целая часть>,<дробная часть>}
X2=X3.
Правило 1: перебор всех вариантов исчезновения.
<число> <знак><целая часть>.<дробная часть>|<целая часть>.<дробная часть>|<знак><дробная часть>|<знак><целая часть>|.<дробная часть>|<целая часть>.|<знак>.|.
Правило 2:
<знак> +|-
<целая часть> <целая часть><цифра>|<цифра>
<дробная часть> <целая часть>
<цифра> 0|…|9
Рассмотренный алгоритм является алгоритмом о приведении фрагмента грамматики к неукорачивающей форме.
Правило вида: «Из нетерминала выводится терминал» называется цепным.
Теорема о приведении грамматик к неудлиняющей форме: для любой контекстно-свободной грамматики существует эквивалентная ей грамматика без цепных правил.
Доказательство: если из грамматики выводится правило: «AB(A/=S)», тогда во всех правилах, гдеAприсутствует в правых частях, делают заменуAнаB: «CaAb–CaBb».
Если из грамматики выводится правило: «AB(A=S)», и имеется группа правил:Ba1|…|an, замена правила наSa1|…|an, и удаление правила «AB» является эквивалентным преобразованием.
Грамматика называется приведённой, если в ней отсутствуют тупики, аннулирующие и обобщённые правила.
Декомпозиция правил КС-грамматик.
Лемма: если в КС-грамматике существует правило вида: «YaXb» и «Xj», то грамматика, в которую добавляется правило: «G2= (VN,VT,S,R,U(Yajb))» эквивалентна исходной.
Доказательство: если a€L(G1), тоa€L(G2). С другой стороны, еслиa€L(G2) и при её выводе не участвуют правила: «Yajb», тоa€L(G1). Если правила «Yajb» и «Xj» используются при выводе цепочки правил, то их замена позволит вывести цепочку в грамматикеG1. Значитa€L(G1), иa€L(G2), аG1 = G2.
Теорема.
Если в грамматике имеется группа правил:
G1: {YαXβ,Xy1…Xyn}
То замена их на правила такого вида:
{Yαy1β,Yαynβ;Xy1…Xyn}
Является ээквивалентным преобразованием.
X/=S,Xy1…Xyn
Доказательство производится многократным применением леммы.
Теорема об исключении внешнего правила:
Если в грамматике имеется группа правил:
{Yα1Xβ1, … ,YαnXβn,Xy}
То замена их на правила такого вида:
{Yαy1β1,Yαynβn;Xy}
Является ээквивалентным преобразованием.
При этом если X/=S, и других правилXв правых частях нет, правилоXyиз грамматики можно удалить.
Доказательство производится многократным применением леммы.
Теорема о декомпозиции правил грамматики:
Замена группы правил вида:
{Yα1Xβ1;Xy1}
…
{YαnXβn;Xyn}
На группу правил:
{Yα1y1β1;Yα1ymβ1}
…
{ Yαny1βn;Yαnymβn}
Является эквивалентным преобразованием, если X/=Sи других правил сXв левых и правых частях правил вывода нет.
Доказательство производится многократным применением леммы.
<Идентификатор> <Буква> | <Буква> <Идентификатор 1>
<Идентификатор 1> <Буква> <Идентификатор 1>| <Цифра> <Идентификатор 1> | <Буква>| <Идентификатор 1>
<Буква> a|…|z
<Цифра> 0|…|9
Грамматика включает 42 правила. Выполним декомпозицию относительно нетерминала «Буква» и «Цифра».
<Идентификатор> a|…|z|a<Идентификатор 1> |…|z<Идентификатор 1>
<Идентификатор 1> a|…|z|0|…|9
3.5. Устранение левой рекурсии и левая факторизация.
Для любой КС-грамматики существует эквивалентная ей грамматика без левой рекурсии.
A Aαi, i=(1,n)
A βj, j=(1,m)
Левую рекурсию на правую:
Aβj<списокA>
<список A>αi<списокA> | ε
Пример:
<Идентификатор> <Буква> | <Идентификатор><Буква> | <Идентификатор><Цифра>
<Идентификатор> <Буква><Идентификатор 1>
<Идентификатор 1> <Буква><Идентификатор 1> | <Цифра><Идентификатор 1> | ε
Если в грамматике имеется группа правил:
Aαβ1|…|αβn, то их преобразование на правила вида:
AαB
Dβ1|…|βnявляется левой факторизацией.