- •Введение
- •Формальные грамматики. Выводы Основные понятия
- •Способы задания языков
- •Операции над языками
- •Формальные грамматики. Выводы
- •Преобразования кс-грамматик Основные понятия
- •Устранение лишних символов
- •Исключение лишних правил
- •Исключение -правил
- •Устранение цепных правил
- •Выделение нетерминала
- •Левая факторизация
- •Устранение левой рекурсии
- •Устранение правой рекурсии
- •Нормальная форма Хомского
- •Нормальная форма Грейбах
- •Операторная кс-грамматика
- •Регулярные языки и конечные распознаватели Правосторонние грамматики
- •Левосторонние грамматики
- •Связь правосторонних и левосторонних грамматик
- •Преобразование кс-грамматики произвольного вида в правостороннюю
- •Конечные распознаватели. Основные понятия
- •Преобразование недетерминированных конечных распознавателей с -переходами в детерминированные
- •Эквивалентность состояний конечных детерминированных распознавателей
- •Эквивалентность конечных детерминированных распознавателей
- •Минимизация конечных детерминированных распознавателей
- •Регулярные множества и регулярные выражения
- •Регулярные выражения и конечные распознаватели
- •Получение регулярного выражения из конечного распознавателя
- •Построение конечного распознавателя по регулярному выражению
- •Конечные распознаватели и регулярные грамматики
- •Получение грамматики из конечного распознавателя
- •Построение конечных распознавателей по регулярным грамматикам
- •Ещё один способ взаимного преобразования право- и левосторонних грамматик
- •Программная реализация конечных детерминированных распознавателей
- •Лексический анализ
- •Принципы построения лексических анализаторов
- •Определение границ лексем
- •Выполнение действий, связанных с лексемами
- •Выделение ключевых слов
- •Программная реализация лексических анализаторов
- •Глава 3. Синтаксический анализ
- •3.1. Автомат с магазинной памятью
- •3.2. Таблично-управляемый предсказывающий разбор
- •3.2.1. Алгоритм разбора сверху-вниз
- •3.2.2. Множества first и follow
- •3.2.3. Конструирование таблиц предсказывающего анализатора
- •3.2.4. Ll(1)-грамматики
- •3.2.7. Рекурсивный спуск
- •3.3. Разбор снизу-вверх типа сдвиг-свертка
- •3.3.1. Основа
- •3.3.2. Lr(k)-анализаторы
- •3.3.4. Конфликты разбора типа сдвиг-свертка
Исключение лишних правил
Правило А назовём лишним, если в грамматике существует вывод цепочки из нетерминала А без участия этого правила.
Лишние правила можно исключить из множества правил грамматики.
Пример.
Исключить лишние правила из грамматики:
1. АaABa
2. AbC
3. Abba
4. BdBC
5. B
6. CBA
7. Ca
В этой грамматике правило 3. Abba лишнее, т.к. существует вывод цепочки bba из нетерминала А без участия этого правила:
A bC bBa bA bbC bba
1 6 5 2 7
Других лишних правил в грамматике нет. Исключая третье правило получаем грамматику без лишних правил:
1. АaABa
2. AbC
4. BdBC
5. B
6. CBA
7. Ca
Исключение -правил
Правило вида А называется -правилом. Грамматику, порождаю-щую язык, несодержащий пустую цепочку, можно преобразовать в эквивалентную ей грамматику без -правил, а грамматику, порождающую язык, содержащий пустую цепочку, можно преобразовать в эквивалентную ей грамматику с единственным -правилом S, где S – начальный нетерминал. Рассмотрим два алгоритма ислючения -правил. В первом алгоритме ис-пользуется понятие аннулирующий нетерминал – нетерминал, который может породить пустую цепочку. Для нахождения всех аннулирующих нетермина-лов грамматики можно использовать следующий алгоритм:
1. Из множества правил грамматики исключить все правила, содер-жащие хотя бы один терминал в правой части (-правила не исключаются), т.к. они не могут участвовать в выводе пустой цепочки.
2. В полученной грамматике найти множество всех продуктивных не-терминалов. Оно так же является множеством всех аннулирующих нетер-миналов в исходной грамматике.
Алгоритм 1 исключения -правил.
1. Найти множество всех аннулирующих нетерминалов.
2. Заменить каждое из правил, правые части которых содержат хотя бы по одному аннулирующему нетерминалу, множеством новых правил. Если правая часть правила содержит k вхождений аннулирующих нетерминалов, то множество, заменяющее это правило, состоит из 2k правил, соответствующим всем возможным способам удаления некоторых (или всех) из этих вхождений.
3. Исключить из множества правил грамматики все -правила и правила вида АА. Если в результате выполнения п.2 получены множества одинаковых правил, то из каждого такого множества оставить только одно.
4. Если исходная грамматика порождает пустую цепочку, то добавить правило S, где S – начальный нетерминал.
Пример.
Грамматика:
1. SAaB 6. Ab
2. SaB 7. BBa
3. ScC 8. B
4. AAB 9. CAB
5. AB 10. Cc
1. Находим множество аннулирующих нетерминалов. Исключая правила, содержащие хотя бы один терминал в правой части, получим грамматику:
4. AAB
5. AB
8. B
9. CAB
В этой грамматике все нетерминалы продуктивные, следовательно {A,B,C} – множество аннулирующих нетерминалов.
2. Исключаем из каждого правила исходной грамматики всеми возможными способами аннулирующие нетерминалы, полученные правила добавляем в множество правил грамматики.
1_1. SAaB 4_1. AAB 7_1. BBa
1_2. SAa 4_2. AA 7_2. Ba
1_3. SaB 4_3. AB 8_1. B
1_4. Sa 4_4. A 9_1. CAB
2_1. SaB 5_1. AB 9_2. CA
2_2. Sa 5_2. A 9_3. CB
3_1. ScC 6_1. Ab 9_4. C
3_2. Sc 10_1. Cc
3. Исключаем из множества правил грамматики все -правила, правила вида АА и из повторяющихся оставляем только одно.
1_1. SAaB 4_1. AAB 9_1. CAB
1_2. SAa 4_3. AB 9_2. CA
1_3. SaB 6_1. Ab 9_3. CB
1_4. Sa 7_1. BBa 10_1. Cc
3_1. ScC 7_2. Ba
3_2. Sc
Алгоритм 2 исключения -правил.
Пока в грамматике есть -правила, выполнять п.1, 2 и 3.
1. Выбрать -правило А.
2. Заменить каждое из правил, правые части которых содержат хотя бы один нетерминал А, множеством новых правил. Если правая часть правила содержит k вхождений нетерминала А, то множество, заменяющее это правило, состоит из 2k правил, соответствующим всем возможным способам удаления некоторых (или всех) из этих вхождений.
3. Исключить из множества правил грамматики правило А и правила вида ВВ. Если в результате выполнения п.2 получены множества одинаковых правил, то из каждого такого множества оставить только одно.
Пример.
Грамматика:
1. SAaB 6. Ab
2. SaB 7. BBa
3. ScC 8. B
4. AAB 9. CAB
5. AB 10. Cc
1. Выбираем -правило 8.В .
2. Исключаем из правой части каждого правила исходной грамматики всеми возможными способами вхождение нетерминала В, полученные правила добавляем в множество правил грамматики.
1_1. SAaB 4_1. AAB 7_1. BBa
1_2. SAa 4_2. AA 7_2. Ba
2_1. SaB 5_1. AB 8_1. B
2_2. Sa 5_2. A 9_1. CAB
3_1. ScC 6_1. Ab 9_2. CA
10_1. Cc
3. Исключаем из множества правил грамматики правило 8_1.В и правило 4_2.АА. Получаем грамматику:
1_1. SAaB 4_1. AAB 7_1. BBa
1_2. SAa 5_1. AB 7_2. Ba
2_1. SaB 5_2. A 9_1. CAB
2_2. Sa 6_1. Ab 9_2. CA
3_1. ScC 10_1. Cc
4. Выбираем -правило 5_2.А .
5. Исключаем из правой части каждого правила исходной грамматики всеми возможными способами вхождение нетерминала А, полученные правила добавляем в множество правил грамматики.
1_1_1. SAaB 4_1_1. AAB 9_1_1. CAB
1_1_2. SaB 4_1_2. AB 9_1_2. CB
1_2_1. SAa 5_1_1. AB 9_2_1. CA
1_2_2. Sa 5_2_1. A 9_2_2. C
2_1_1. SaB 6_1_1. Ab 10_1_1. Cc
2_2_1. Sa 7_1_1. BBa
3_1_1. ScC 7_2_1. Ba
6. Исключаем из множества правил грамматики правило 5_2_1.А. Из каждого множества одинаковых правил {1_1_2, 2_1_1}, {1_2_2, 2_2_1}, {4_1_2, 5_1_1} оставляем по одному.
1_1_1. SAaB 4_1_1. AAB 9_1_1. CAB
1_1_2. SaB 4_1_2. AB 9_1_2. CB
1_2_1. SAa 6_1_1. Ab 9_2_1. CA
1_2_2. Sa 7_1_1. BBa 9_2_2. C
3_1_1. ScC 7_2_1. Ba 10_1_1. Cc
7. Выбираем -правило 9_2_2.С .
8. Исключаем из правой части каждого правила исходной грамматики всеми возможными способами вхождение нетерминала С, полученные правила добавляем в множество правил грамматики.
1_1_1_1. SAaB 4_1_1_1. AAB 9_1_1_1. CAB
1_1_2_1. SaB 4_1_2_1. AB 9_1_2_1. CB
1_2_1_1. SAa 6_1_1_1. Ab 9_2_1_1. CA
1_2_2_1. Sa 7_1_1_1. BBa 9_2_2_1. C
3_1_1_1. ScC 7_2_1_1. Ba 10_1_1_1. Cc
3_1_1_2. Sc
9. Исключаем правило 9_2_2_1. С.
1_1_1_1. SAaB 4_1_1_1. AAB 9_1_1_1. CAB
1_1_2_1. SaB 4_1_2_1. AB 9_1_2_1. CB
1_2_1_1. SAa 6_1_1_1. Ab 9_2_1_1. CA
1_2_2_1. Sa 7_1_1_1. BBa 10_1_1_1. Cc
3_1_1_1. ScC 7_2_1_1. Ba
3_1_1_2. Sc
В полученной грамматике нет -правил, правил вида ВВ и оди-наковых правил.
