Читайте также:
|
|
Пусть дана грамматика для арифметических выражений:
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)
Контрольные вопросы
1. Какого типа грамматики могут быть приведены к нормальной форме Хомского?
2. Каковы требования на правила грамматики в БНФ?
3. Обязательно ли наличие рекурсии в правилах грамматики? Какого вида рекурсия в них может использоваться? Может ли в правилах одной грамматики присутствовать рекурсия разных видов?
4. От какого вида рекурсии в правилах грамматики принято избавляться и для чего это делается?
Дата добавления: 2015-07-12; просмотров: 144 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Алгоритм 5. Преобразование грамматики к БНФ (Хомского). | | | Распознаватели КС-языков с возвратом |