Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Формальные языки и грамматики.doc
Скачиваний:
161
Добавлен:
01.05.2014
Размер:
1.51 Mб
Скачать

2.5 Исключение леворекурсивных правил.

Определение. Правило вида <A>   <A>, где A VA, (Vт VA) *, называетсяправорекурсивным, а правило вида<A>  <A>- леворекурсивным.

 

Утверждение. Для каждой КС-грамматики Г, содержащей леворекурсивные правила, можно  построить эквивалентную грамматику Г', не содержащую леворекурсивных правил.

Способ построения эквивалентной грамматики заключается в следующем. Допустим, что исходная грамматика Г содержит правила:                        <A> <A>1 | <A>2 | ... |<A>m| , где ни одна цепочкане начинается с <A> и (Vт VA) *. Введем новый нетерминал <A'> и преобразуем правила так:

<A> 1 |2 |...|n|1<A'> |2<A'>|...|n<A'>, <A'> 1 |2 |...|m|1<A'> |2<A'>|...|m<A'>.

Заменяя все правила с левой рекурсией в Г описанным способом, получим грамматику Г', причем L(Г)=L(Г') , поскольку каждая цепочка, выведенная в грамматике Г, может быть построена в грамматике Г'. Рассмотрим построение выводов в Г и Г'. В грамматике Г вывод цепочки имеет вид:

< A> <A> 1 <A> 1 1 <A> 1 1 1 1 1 11,

в грамматике Г' эта же цепочка выводится так:  

<A> 1<A'> 11<A'> 1 11<A'> 1 1 11.

Чтобы показать технику преобразования, рассмотрим пример. Требуется преобразовать грамматику Г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>) },

не содержащую леворекурсивных правил.

  • 2.6 Исключение цепных правил.

 

Определение.Правило грамматики вида <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>, где- цепочка словаря(Vт VA)*, то в S(<Ai>) включим правило <Ai>  . Построим новую схему 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>$ называетсяаннулирующим правилом.

Соседние файлы в предмете Теория языков программирования