
- •Введение
- •Формальные грамматики. Выводы Основные понятия
- •Способы задания языков
- •Операции над языками
- •Формальные грамматики. Выводы
- •Преобразования кс-грамматик Основные понятия
- •Устранение лишних символов
- •Исключение лишних правил
- •Исключение -правил
- •Устранение цепных правил
- •Выделение нетерминала
- •Левая факторизация
- •Устранение левой рекурсии
- •Устранение правой рекурсии
- •Нормальная форма Хомского
- •Нормальная форма Грейбах
- •Операторная кс-грамматика
- •Регулярные языки и конечные распознаватели Правосторонние грамматики
- •Левосторонние грамматики
- •Связь правосторонних и левосторонних грамматик
- •Преобразование кс-грамматики произвольного вида в правостороннюю
- •Конечные распознаватели. Основные понятия
- •Преобразование недетерминированных конечных распознавателей с -переходами в детерминированные
- •Эквивалентность состояний конечных детерминированных распознавателей
- •Эквивалентность конечных детерминированных распознавателей
- •Минимизация конечных детерминированных распознавателей
- •Регулярные множества и регулярные выражения
- •Регулярные выражения и конечные распознаватели
- •Получение регулярного выражения из конечного распознавателя
- •Построение конечного распознавателя по регулярному выражению
- •Конечные распознаватели и регулярные грамматики
- •Получение грамматики из конечного распознавателя
- •Построение конечных распознавателей по регулярным грамматикам
- •Ещё один способ взаимного преобразования право- и левосторонних грамматик
- •Программная реализация конечных детерминированных распознавателей
- •Лексический анализ
- •Принципы построения лексических анализаторов
- •Определение границ лексем
- •Выполнение действий, связанных с лексемами
- •Выделение ключевых слов
- •Программная реализация лексических анализаторов
- •Глава 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. Конфликты разбора типа сдвиг-свертка
Выделение нетерминала
Преобразование, обратное замене, назовём выделением нетерминала.
Если грамматика содержит n правил вида Вi , где 1in, n правил Аi , где 1in и других правил с левой частью А нет, то n правил вида Вi , где 1in можно заменить одним правилом ВА .
Если грамматика содержит n правил вида Вi , где 1in, то их можно заменить одним правилом ВА , где А – новый нетерминал, и ввести n правил Аi , где 1in.
Если в правых частях правил грамматики встречается цепочка , то её можно заменить на новый нетерминал А и ввести правило А.
Левая факторизация
Особым случаем выделения нетерминала является левая факториза-ция.
Если n2 правил грамматики имеют одинаковые левые части, допустим нетерминал А, и правые части начинаются одним или несколькими одинаковыми символами (имеют общий префикс ), т.е. i-ое правило имеет вид Аi, где 1in, то можно общий префикс вынести в отдельное правило АВ, где В – новый нетерминал, и добавить n правил вида Вi, где 1in. Такое преобразование называется левой факторизацией. Результат применения левой факторизации неоднозначный, зависит от выбора префикса, выносимого в отдельное правило (например, в качестве префикса можно взять один символ или общий префикс наибольшей длины) и количества правил, участвующих в факторизации.
Пример 1.
Исходная грамматика |
Первый шаг |
Второй шаг |
SabBa SabBb SabA BbB Bb Aa |
SabC CBa CBb CA BbD DB D Aa |
SabC CBE CA Ea Eb BbD DB D Aa |
Пример 2.
Исходная грамматика |
Первый шаг |
Второй шаг |
SabBa SabBb SabA BbB Bb Aa |
SabBE SabA Ea Eb BbD DB D Aa |
SabC CBE CA Ea Eb BbD DB D Aa |
Пример 3.
Исходная грамматика |
Первый шаг |
Второй шаг |
Третий шаг |
SabBa SabBb SabA BbB Bb Aa |
SaC CbBa CbBb CbA BbD DB D Aa |
SaC CbE EBa EBb EA BbD DB D Aa |
SaC CbE EBF EA Fa Fb BbD DB D Aa |
Устранение левой рекурсии
Правило А называется рекурсивным, если существует вывод *А . Если и , то правило А называется леворекурсивным. Правило называется самолеворекурсивным, если его край совпадает с левой частью. Самолеворекурсивное правило также является и леворекурсивным.
1. Исключение самолеворекурсивных правил.
Предположим, что нетерминал А имеет m самолеворекурсивных правил АА i , где 1im, и n правил А j , где 1jn, которые не являются самолеворекурсивными и других правил с левой частью А нет. Эти правила заменяются следующими:
А jВ, где 1jn, В – новый нетерминал,
В iВ, где 1im,
В
2. Исключение леворекурсивных правил.
Алгоритм исключения леворекурсивных правил.
1. Обозначить нетерминалы грамматики А1, А2,…,Аn, где n – количество нетерминалов.
2. Для каждого нетерминала грамматики Аi, где 1in, выполнить п.3 и 4.
3. Для каждого правила вида АiАj, где 1ji-1, выполнить замену края (новые правила необходимо учитывать при выполнении п.3).
4. Исключить самолеворекурсивные правила для нетерминала Аi (новые нетерминалы далее не рассматривать).
Алгоритм применим, если грамматика не имеет циклов (цепных правил) и -правил. Цепные правила и -правила могут быть удалены предварительно. Получающаяся грамматика без левой рекурсии может иметь -правила.
Пример.
Устранить левую рекурсию в грамматике:
А1А1аА3
А1А2b
А2А1c
А2А3a
А3А1b
А3c
Рассматриваем нетерминал А1.
Правил вида А1А0 в грамматике нет, т.к. нет нетерминала А0, поэтому замену края (п.3) не выполняем.
Исключаем самолеворекурсивное правило А1А1аА3 , получаем грамматику:
А1А2bB1
А2А1c
А2А3a
А3А1b
А3c
B1аА3B1
B1
Рассматриваем нетерминал А2.
Выполняем замену края в правиле А2А1с , получаем грамматику:
А1А2bB1
А2А2bB1c
А2А3a
А3А1b
А3c
B1аА3B1
B1
Исключаем самолеворекурсивное правило А2А2bB1c , получаем грамматику:
А1А2bB1
А2А3aB2
А3А1b
А3c
B1аА3B1
B1
B2bB1cB2
B2
Рассматриваем нетерминал А3.
Выполняем замену края в правиле А3А1b , получаем грамматику:
А1А2bB1
А2А3aB2
А3А2bB1b
А3c
B1аА3B1
B1
B2bB1cB2
B2
Выполняем замену края в правиле А3А2bB1b , получаем грамматику: А1А2bB1
А2А3aB2
А3 А3aB2bB1b
А3c
B1аА3B1
B1
B2bB1cB2
B2
Исключаем самолеворекурсивное правило А3А3aB2bB1b, получаем грамматику:
А1А2bB1
А2А3aB2
А3cB3
B1аА3B1
B1
B2bB1cB2
B2
B3aB2bB1bB3
B3
Грамматика без леворекурсивных правил получена. Далее можем выполнить две одиночные замены и получим грамматику:
А1 cB3aB2bB1
А3cB3
B1аcB3B1
B1
B2bB1cB2
B2
B3aB2bB1bB3
B3