Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 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; просмотров: 383; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.41 (0.006 с.) |