Левая рекурсия. Нормальная форма Грейбах 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Левая рекурсия. Нормальная форма Грейбах



Символ AÎVN в КС-грамматике G(VT,VN,P,S) называется рекурсивным, если для него существует цепочка вывода вида AÞ+aAb, где a, bÎ(VNÈVT)*.

Виды рекурсии различают в зависимости от цепочек a и b. Если a=e, а b¹e, то рекурсия называется левой, а грамматика – леворекурсивной. Если наоборот: a¹e, а b=e, то рекурсия называется правой, а грамматика – праворекурсивной. Если обе цепочки a=b=e, то рекурсия представляет собой цикл. В дальнейшем будем рассматривать только приведённые грамматики, в которых нет цепных правил и, соответственно, циклов.

Замечание.

Любая КС-грамматика может быть как праворекурсивной, так и леворекурсивной, а также той и другой одновременно – по различным нетерминальным символам.

Некоторые алгоритмы левостороннего разбора для КС-языков не работают с леворекурсивными грамматиками, поэтому для них необходимо исключить левую рекурсию из правил вывода. Для этой цели существует специальный алгоритм устранения левой рекурсии. Любую грамматику можно привести к нелеворекурсивному или неправорекурсивному виду путем эквивалентных преобразований.

Заметим, что рекурсия лежит в основе построения языков на базе правил грамматики в форме Бэкуса-Наура, поэтому полностью исключить рекурсию из правил вывода невозможно, можно только устранить какой-то один из её видов – левый или правый.

Алгоритм 6. Устранение левой рекурсии.

Алгоритм работает с множеством правил исходной грамматики P, множеством нетерминальных символов VN и двумя счетчиками i и j.

1. Обозначим нетерминальные символы грамматики как VN={A1,A2,…,An}, i:=1.

2. Рассмотрим правила для символа Ai. Если они не содержат левой рекурсии, то переносим их во множество P¢ без изменений, а символ Ai добавляем во множество нетерминальных символов VN¢. В противном случае перепишем эти правила в следующем виде: Ai®Aia1½Aia2½…½Aiam½b1½b2½…½bp, где "j½1 £ j £ p ни одна из цепочек bj не начинается с символов Ak, таких, что k £ i. Вместо этого правила во множество P¢ записываем два правила вида:

Ai®b1½b2½…½bp½b1Ai¢½b2Ai¢½…½bpAi¢,

Ai¢®a1½a2½…½am½a1Ai¢½a2Ai¢½…½amAi¢

Символы Ai и Ai¢ включаем во множество VN¢. Теперь все правила для Ai начинаются либо с терминального символа, либо с нетерминального символа Ak, такого, что k > i.

3. Если i=n, то грамматика G¢ построена, иначе i:=i+1, j:=1 Þ на шаг 4.

4. Если для символа Ai во множестве правил P есть правила вида Ai®Aja, aÎ(VNÈVT)*, то заменить их на правила вида Ai®b1a½b2a½…½bma, причём Aj®b1½b2½…½bm – все правила для символа Aj. Поскольку правая часть правил Aj®b1½b2½…½bm уже начинается с терминального символа или нетерминального Ak, k>j, то и правая часть правил для Ai будет удовлетворять этому условию.

5. Если j=i–1, то переход на шаг 2, иначе j:=j+1 и переход на шаг 4.

6. Целевым символом новой грамматики G¢ становится символ Ak, соответствующий символу S исходной грамматики.

Пример 7.

Пусть дана грамматика для арифметических выражений:

G ({+,–,/,*,a,b,(,)}, {S,T,E}, P, S), где правила P имеют вид:

(1) S ® S+T½S–T½T (2) T ® T*E½T/E½E (3) E ® (S)½a½b.

Эта грамматика леворекурсивная. Выполним эквивалентные преобразования и построим нелеворекурсивную грамматику G¢.

Шаг 1. Обозначим множество нетерминальных символов VN={A1,A2,A3}, i:=1. Тогда правила грамматики примут вид:

A1 ® A1+A2½A1–A2½A2

A2 ® A2*A3½A2/A3½A3

A3 ® (A1)½a½b.

Шаг 2. Правила для A1: A1 ® A1+A2½A1–A2½A2 запишем в виде A1®A1a1½A1a2½b1, где a1= +A2, a2= –A2, b1=A2. Согласно алгоритму, запишем в P¢ новые правила для A1:

A1 ® A2½A2A1¢, A1¢ ® +A2½–A2½+A2A1¢½–A2A1¢. Символы A1 и A1¢ заносим в VN¢. Получим VN¢={A1, A1¢}.

Шаг 3. Поскольку i=1<3, i:=i+1=2, j:=1, переходим на следующий шаг.

Шаг 4. Для символа A2 во множестве правил P нет правила вида A2®A1a, поэтому на этом шаге никаких действий не выполняется.

Шаг 5. Так как j=1=i–1, переходим на шаг 2.

Шаг 2. Правила для A2: A2 ® A2*A3½A2/A3½A3 запишем в виде A2®A2a1½A2a2½b1, где a1=*A3, a2=/A3, b1=A3. Согласно алгоритму, запишем в P¢ новые правила для A2:

A2 ® A3½A3A2¢, A2¢ ® *A3½/A3½*A3A2¢½/A3A2¢. Символы A2 и A2¢ добавим в VN¢. Получим VN¢={A1, A1¢, A2, A2¢}.

Шаг 3. Поскольку i=2<3, то i:=3, j:=1, переходим на следующий шаг.

Шаг 4. Для символа A3 во множестве правил P нет правила вида A3®A1a, поэтому на этом шаге никаких действий не выполняется.

Шаг 5. Так как j=1< i–1, то j:=j+1=2 и переходим на шаг 4.

Шаг 4. Для символа A3 во множестве правил P нет правила вида A3®A2a, поэтому на этом шаге никаких действий не выполняется.

Шаг 5. Так как j=2=i–1, переходим на шаг 2.

Шаг 2. Правила для A3: A3 ® (A1)½a½b не содержат левой рекурсии, поэтому поместим их в P¢ без изменений. Символ A3 добавим в VN¢. Получим VN¢={A1, A1¢, A2, A2¢, A3}.

Шаг 3. Поскольку i=3, построение грамматики закончено.

В итоге получили нелеворекурсивную грамматику G ({+,–,/,*,a,b,(,)}, {A1, A1¢, A2, A2¢, A3}, P, A1), где правила P имеют вид:

A1 ® A2½A2A1¢,  A2 ® A3½A3A2¢, 
A1¢ ® +A2½–A2½+A2A1¢½–A2A1¢. A2¢ ® *A3½/A3½*A3A2¢½/A3A2¢.
  A3 ® (A1)½a½b.

Грамматика называется грамматикой в нормальной форме Грейбах, если она не является леворекурсивной и в её множестве правил присутствуют только правила следующего вида:

1. A®aa, где aÎVT aÎVN*.

2. S®e, если eÎL(G) и S не встречается в правых частях правил.

Нормальная форма Грейбах удобна для построения нисходящих левосторонних распознавателей.

Алгоритм 7. Преобразование приведенной КС-грамматики без левой рекурсии к нормальной форме Грейбах с применением линейного порядка:

Вход: Нелеворекурсивная приведенная КС-грамматика G = (VN, VT, Р, S).

Выход: Эквивалентная КС-грамматика G' в нормальной форме Грейбах. Описание алгоритма:

Шаг 1. Построить такой линейный порядок (<) на N, что каждое A-правило начинается либо с терминала, либо с такого нетерминала В, что А < В. Упорядочить N = 1, А2,..., Ап) так, что А1< А2<... < А n. Причем правила, начинающиеся с нетерминала AN < AT правил, начинающихся с терминала. Между правилами вида AT порядок значения не имеет.

Шаг 2. Положить i = п’, где n’ –число правил, начинающихся с терминала

Шаг 3. Если i = 0, то перейти к шагу 5 алгоритма. В противном случае заменить каждое правило вида Ai®Аj a, где j > i, правилами Аi ® b1a | b2a

| … | bma,  где Aj®b1 | b2| … | bm –все правила Aj

Шаг 4. Положить i= i-1 и перейти к шагу 3.

Шаг 5. Теперь правая часть каждого правила начинается терминальным символом. В каждом правиле А ® аХi...Xk заменить XjÎVT  новым нетерминалом X'j.

Шаг 6. Для новых нетерминалов X'j, введенных на 5-ом шаге,

добавить правила X'j ® Xj

Пример 8. G={{*,n},{S,A,B},{S→B*A, B→n | A*B, A→n},S}

1. Упорядочим символы S<B<A, i=2 (шаги 1,2)

2. Заменяем правило B→n | A*B на B→n | n*B, подставляя из A→n (шаг 3)

3. i=1 (шаг 4)

4. Заменяем правило S→B*A на S→ n*A |n*B*A, подставляя из B→n | n*B

5. i=0 (шаг 4)

6. Введем нетерминальный символ <*> (шаг 5)

7. Заменим * на <*>

P’: S→ n<*>A |n<*>B<*>A

    B→n | n<*>B

A→n

<*>→*

              G’= ({*,n},{S,A,B, <*>},P’, S)

4.2.3.3. Контрольные вопросы

1. Какого типа грамматики могут быть приведены к нормальной форме Хомского?

2. Каковы требования на правила грамматики в БНФ?

3. Обязательно ли наличие рекурсии в правилах грамматики? Какого вида рекурсия в них может использоваться? Может ли в правилах одной грамматики присутствовать рекурсия разных видов?

4. От какого вида рекурсии в правилах грамматики принято избавляться и для чего это делается?



Поделиться:


Последнее изменение этой страницы: 2021-03-09; просмотров: 267; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.21.100.34 (0.015 с.)