3.2.Преобразование КС-грамматик
Исключение леворекурсивных правил.
Определение. Правило вида <A> ® a <A> , где A Î VA , a Î(Vт ÈVA) * , называется праворекурсивным, а правило вида <A> ® <A>a - леворекурсивным. |
Утверждение. Для каждой КС-грамматики Г,
содержащей леворекурсивные правила, можно |
Способ построения эквивалентной грамматики заключается в следующем.
Допустим, что исходная грамматика Г содержит
правила:
<A> ® <A>a
1 | <A>a 2 |
... |<A>a m|
,
где ни одна цепочка b не начинается с
<A> и a1, b1Î(Vт ÈVA)
* .
Введем новый нетерминал
<A'> и преобразуем правила так:
<A> ® b 1 |
b 2 |...| b n | b 1<A'> | b 2<A'>|...| b n<A'>,
<A'> ®a 1
| a 2 |...| a m| a 1<A'> |a 2<A'>|...|a m<A'>.
Заменяя все правила с левой рекурсией в Г описанным
способом, получим грамматику Г',
причем L(Г)=L(Г') , поскольку каждая цепочка,
выведенная в грамматике Г, может быть
построена в грамматике Г'. Рассмотрим построение выводов в Г и Г'. В грамматике
Г вывод
цепочки имеет вид:
< A> Þ <A>a 1 Þ <A>a 1a 1 Þ <A>a 1a 1a 1 Þ b 1a 1a 1a 1,
в грамматике Г' эта же цепочка выводится так:
<A> Þ b 1<A'> Þ b 1a 1<A'> Þ b 1a 1a 1<A'> Þ b 1a 1a 1a 1.
Чтобы показать технику преобразования, рассмотрим пример.
Требуется преобразовать
грамматику Г1.
9 (рассмотренную ранее), которая задана схемой:
Г1. 9: R={<E> ®
<E> + <T> | <T>,
< T> ® <T> * <F> | <F>,
<F> ® ( <E> ) | a}.
Следуя описанному способу, правила <E> ® <E> + <T> | <T> преобразуем в
правила
<E>®
<T> | <T><E'> и <E'> ® +<T> | +<T><E'> , а правила
<T> ® <T> * <F> | <F>
преобразуем в правила <T> ® <F> |
<F><T'> и <T'> ® *< F> | * <F><T'>.
В результате получаем грамматику Г'1. 9, имеющую схему:
Г'1. 9 : R'= { <E> ® < T>,
<E>
® <T><E'>,
< E'>® + <T>,
<E'> ® +
<T><E'>,
<T> ®
<F>,
<T> ®
<F><T'>,
<T'> ® * <F>,
<T'> ® *
<F><T'>,
< F> ® a,
<F> ®
(<E>) },
не содержащую леворекурсивных правил.
Определение.
Правило грамматики вида <A> ® <B>, где <A>,<B> ÎVA, |
Утверждение. Для КС-грамматики Г, содержащей цепные правила , можно построить эквивалентную ей грамматику Г', не содержащую цепных правил. |
Идея доказательства заключается в
следующем. Если схема грамматики имеет вид
R = {...,<A> ® <B>,...,<B> ® <C>, ... , <C> ® a<X> },
то такая грамматика
эквивалентна грамматике со схемой
R' = {...,<A> ® a<X>,...},
поскольку вывод в грамматике со схемой R цепочки a<X> :
<A> Þ< B> Þ <C> Þ a<X>
может быть получен
в грамматике со схемой R' с помощью правила <A> ® a<X>.
В общем случае доказательство последнего утверждения можно выполнить так.
Разобьем R на два подмножества R1 и R2,
включая в R1 все правила вида <A> ® < B>.
Для каждого правила из R1 найдем множество правил S(<Ai>), которые строятся так:
если <Ai> Þ * <Aj>
и в R2 есть правило <Aj> ® a , где a - цепочка
словаря (Vт ÈVA)*
,
то в S(<Ai>) включим правило <Ai> ® a .
Построим новую схему R' путем объединения правил R2 и всех
построенных
множеств S(<Ai>). Получим грамматику
Г' = {Vт ,Va
, I , R'}, которая эквивалентна
заданной и не содержит правил вида <A> ® <B>.
В качестве примера выполним исключение цепных правил из грамматики Г1. 9
со схемой :
Г1. 9: R={<E> ®
<E> + <T> | <T>,
< T> ® < T> * <F> | <F>,
<F> ® ( <E> ) | a}.
Вначале разобьем правила
грамматики на два подмножества:
R1 = { <E> ®
<T>,<T> ®
<F> } ,
R2 = { <E> ®
<E>+<T>, <T> ®
<T>*<F>, <F>®
(<E>) | a }
Для каждого правила из R1
построим соответствующее подмножество.
S(<E>) = { <E> ®< T>*<F>, <E> ® (<E>) | a },
S(<T>) = { <T> ®
(<E>) | a}
В результате получаем искомую схему грамматики без цепных правил в виде:
R2
U S(<E>) U S(<T>) = { <E> ® --> <T>+<T> |
<T>*<F> | (<E>) | a,
<T> ® <T>*<F> |
(<E>) | a,
<F> ®
(<E>) | a }
Последний вид рассматриваемых
преобразований связан с удалением из
грамматики правил с пустой правой частью.
Определение. Правило вида <A> ® $ называется аннулирующим правилом. |
Преобразование
неукорачивающих грамматик.
Для грамматик, содержащих аннулирующие правила, справедливо следующее
утверждение.
Утверждение. Для каждой КС-грамматики Г',
содержащей аннулирующие правила, можно |
Построение неукорачивающей грамматики предполагает
увеличение числа правил заданной
грамматики путем построения дополнительных правил, получаемых в результате
исключения
нетерминалов аннулирующих правил. Чтобы построить
дополнительные правила необходимо
выполнить все возможные подстановки пустой цепочки вместо аннулирующего нетерминала во все правила грамматики. Если же в грамматике
есть правило вида <I> ®
$ и символ <I> входит в правые части других правил грамматики, то следует
ввести новый начальный символ <I'> и заменить правило <I> ® $ двумя новыми правилами:
<I'> ® $ и
<I'>®
<I> .
В качестве иллюстрации способа построения неукорачивающих
грамматик, исключим аннулирующие правила из следующей грамматики:
Г3. 3 :
R = { <I> ® a<I>b<I>,
<I> ® b<I>a<I>,
<I> ® $ }
Выполняя все возможные замены символа I в первом правиле грамматики, получаем
четыре
правила вида:
<I> ® a<I>b<I>,
<I> ® ab<I>,
<I>®
a<I>b, <I>® ab .
Поступая аналогично со вторым правилом, имеем:
<I> ® b<I>a<I>,
<I> ® ba<I>,
<I> ®
b<I>a, <I> ® ba.
Учитывая, что начальный символ, образующий аннулирующее
правило, входит в правые части
других правил грамматики, заменим правило <I> ® $ правилами вида <I'>® $ и
<I'>®
<I> .
Построенная совокупность правил образует схему искомой неукорачивающей
грамматики. Все
приведенные выше преобразования грамматик могут быть использованы и оказаться полезными при построении как конечных, так и
магазинных автоматов.