Контекстно-свободные языки. Свойства и распознаватели КС-языков. Преобразование КС-грамматик. КС-грамматики в нормальной форме, страница 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 исходной грамматики.

Пример.

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

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  Распознаватели КС-языков с возвратом

Распознаватели КС-языков с возвратом представляют собой самый простой тип распознавателей, основанный на модели недетерминированного МП-автомата. Как известно, при работе такого автомата возможны альтернативные варианты его поведения. Существуют два варианта реализации алгоритма работы недетерминированного МПА.