Заметим, что рекурсия лежит в основе построения языков на базе правил грамматики в форме Бэкуса-Наура, поэтому полностью исключить рекурсию из правил вывода невозможно, можно только устранить какой-то один из её видов – левый или правый.
Алгоритм устранения левой рекурсии.
Алгоритм работает с множеством правил исходной грамматики 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 исходной грамматики.
Пример.
Пусть дана грамматика для арифметических выражений:
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®l, если lÎL(G) и S не встречается в правых частях правил.
Нормальная форма Грейбах удобна для построения нисходящих левосторонних распознавателей.
3.3.3 Контрольные вопросы
1. Какого типа грамматики могут быть приведены к нормальной форме Хомского?
2. Каковы требования на правила грамматики в БНФ?
3. Обязательно ли наличие рекурсии в правилах грамматики? Какого вида рекурсия в них может использоваться? Может ли в правилах одной грамматики присутствовать рекурсия разных видов?
4. От какого вида рекурсии в правилах грамматики принято избавляться и для чего это делается?
3.4 Виды распознавателей КС-языков
3.4.1 Распознаватели КС-языков с возвратом
Распознаватели КС-языков с возвратом представляют собой самый простой тип распознавателей, основанный на модели недетерминированного МП-автомата. Как известно, при работе такого автомата возможны альтернативные варианты его поведения. Существуют два варианта реализации алгоритма работы недетерминированного МПА.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.