
- •Введение
- •Формальные грамматики. Выводы Основные понятия
- •Способы задания языков
- •Операции над языками
- •Формальные грамматики. Выводы
- •Преобразования кс-грамматик Основные понятия
- •Устранение лишних символов
- •Исключение лишних правил
- •Исключение -правил
- •Устранение цепных правил
- •Выделение нетерминала
- •Левая факторизация
- •Устранение левой рекурсии
- •Устранение правой рекурсии
- •Нормальная форма Хомского
- •Нормальная форма Грейбах
- •Операторная кс-грамматика
- •Регулярные языки и конечные распознаватели Правосторонние грамматики
- •Левосторонние грамматики
- •Связь правосторонних и левосторонних грамматик
- •Преобразование кс-грамматики произвольного вида в правостороннюю
- •Конечные распознаватели. Основные понятия
- •Преобразование недетерминированных конечных распознавателей с -переходами в детерминированные
- •Эквивалентность состояний конечных детерминированных распознавателей
- •Эквивалентность конечных детерминированных распознавателей
- •Минимизация конечных детерминированных распознавателей
- •Регулярные множества и регулярные выражения
- •Регулярные выражения и конечные распознаватели
- •Получение регулярного выражения из конечного распознавателя
- •Построение конечного распознавателя по регулярному выражению
- •Конечные распознаватели и регулярные грамматики
- •Получение грамматики из конечного распознавателя
- •Построение конечных распознавателей по регулярным грамматикам
- •Ещё один способ взаимного преобразования право- и левосторонних грамматик
- •Программная реализация конечных детерминированных распознавателей
- •Лексический анализ
- •Принципы построения лексических анализаторов
- •Определение границ лексем
- •Выполнение действий, связанных с лексемами
- •Выделение ключевых слов
- •Программная реализация лексических анализаторов
- •Глава 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. Исключение самоправорекурсивных правил.
Предположим, что нетерминал А имеет 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, выполнить замену нетерминала Аj (новые правила необходимо учитывать при выполнении п.3).
4. Исключить самоправорекурсивные правила для нетерминала Аi (новые нетерминалы далее не рассматривать).
Алгоритм применим, если грамматика не имеет циклов (цепных правил) и -правил. Цепные правила и -правила могут быть удалены предварительно. Получающаяся грамматика без правой рекурсии может иметь -правила.
Пример.
Устранить правую рекурсию в грамматике:
А1аА3А1
А1bА2
А2cА1
А2aА3
А3bА1
А3c
Рассматриваем нетерминал А1.
Правил вида А1А0 в грамматике нет, т.к. нет нетерминала А0, поэтому замену нетерминала А1 (п.3) не выполняем.
Исключаем самоправорекурсивное правило А1аА3А1 , получаем грамматику:
А1 В1bА2
А2cА1
А2aА3
А3bА1
А3c
B1В1аА3
B1
Рассматриваем нетерминал А2.
Выполняем замену нетерминала А1 в правиле А2сА1 , получаем грамматику:
А1 В1bА2
А2cВ1bА2
А2aА3
А3bА1
А3c
B1В1аА3
B1
Исключаем самоправорекурсивное правило А2cВ1bА2 , получаем грамматику:
А1 В1bА2
А2 В2aА3
А3bА1
А3c
B1В1аА3
B1
B2В2cВ1b
B2
Рассматриваем нетерминал А3.
Выполняем замену нетерминала А1 в правиле А3bА1 , получаем грамматику:
А1 В1bА2
А2 В2aА3
А3bВ1bА2
А3c
B1В1аА3
B1
B2В2cВ1b
B2
Выполняем замену нетерминала А2 в правиле А3bВ1bА2 , получаем грамматику:
А1 В1bА2
А2 В2aА3
А3bВ1bВ2aА3
А3c
B1В1аА3
B1
B2В2cВ1b
B2
Исключаем самоправорекурсивное правило А3bВ1bВ2aА3, получаем грамматику:
А1 В1bА2
А2 В2aА3
А3B3c
B1В1аА3
B1
B2В2cВ1b
B2
B3В3bВ1bВ2a
B3
Грамматика без праворекурсивных правил получена. Далее можем выполнить две одиночные замены и получим грамматику:
А1 В1bВ2aB3c
B1В1аB3c
B1
B2В2cВ1b
B2
B3В3bВ1bВ2a
B3
Нормальная форма Хомского
Любой КС язык может быть задан КС-грамматикой в нормальной форме Хомского (НФХ), а любую КС-грамматику можно преобразовать в эквивалентную ей грамматику в НФХ.
Грамматика в НФХ содержит только правила трёх видов:
1) АВС , где А, В, С – нетерминалы;
2) Аt , где t – терминал;
3) S , если пустая цепочка принадлежит языку, причём начальный нетерминал S не встречается в правых частях правил.
Другими словами, это грамматика без -правил, а правые части правил содержат либо два нетерминала, либо один терминал.
Для преобразования произвольной грамматики в НФХ предварительно нужно устранить лишние символы, -правила и цепные правила, т.е. привести грамматику.
Алгоритм преобразования приведённой грамматики в НФХ.
1. Для каждого правила вида АХ, где А – нетерминал, Х – терминал или нетерминал, - цепочка терминалов или нетерминалов, содержащая более одного символа, выполнить следующее преобразование:
если в грамматике есть одиночное правило С, то
правило АХ заменить на АХС, иначе ввести
правило N , где N – новый нетерминал, и правило
АХ заменить на АХN .
При выполнении п.1 учитывать вводимые правила.
В результате выполнения п.1 получим грамматику, правые части правил котрой содержат не более двух символов.
2. Для каждого правила вида АtB, где А, B – нетерминалы, t – терминал, выполнить следующее преобразование:
если в грамматике есть одиночное правило Сt, то
правило АtB заменить на АСB, иначе ввести
правило Nt , где N – новый нетерминал, и правило
АtB заменить на АNB .
3. Для каждого правила вида АBt, где А, B – нетерминалы, t – терминал, выполнить следующее преобразование:
если в грамматике есть одиночное правило Сt, то
правило АBt заменить на АBС, иначе ввести
правило Nt , где N – новый нетерминал, и правило
АBt заменить на АBN .
Пример.
Преобразовать заданную грамматику в НФХ.
Исходная грамматика |
Пункт 1 алгоритма |
Пункты 2 и 3 алгоритма |
|
АaBCd |
АaN1 |
АaN1 |
А N2N1 |
АCd |
N1BCd |
N1BA |
N2a |
BaB |
АCd |
АCd |
N1BA |
Bb |
BaB |
BaB |
АCN3 |
CABA |
Bb |
Bb |
N3d |
|
CABA |
CAN1 |
B N2B |
|
|
|
Bb |
|
|
|
CAN1 |