Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Левая рекурсия. Нормальная форма Грейбах
Символ 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 имеют вид:
Грамматика называется грамматикой в нормальной форме Грейбах, если она не является леворекурсивной и в её множестве правил присутствуют только правила следующего вида: 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 с.) |