- •Введение
- •Формальные грамматики. Выводы Основные понятия
- •Способы задания языков
- •Операции над языками
- •Формальные грамматики. Выводы
- •Преобразования кс-грамматик Основные понятия
- •Устранение лишних символов
- •Исключение лишних правил
- •Исключение -правил
- •Устранение цепных правил
- •Выделение нетерминала
- •Левая факторизация
- •Устранение левой рекурсии
- •Устранение правой рекурсии
- •Нормальная форма Хомского
- •Нормальная форма Грейбах
- •Операторная кс-грамматика
- •Регулярные языки и конечные распознаватели Правосторонние грамматики
- •Левосторонние грамматики
- •Связь правосторонних и левосторонних грамматик
- •Преобразование кс-грамматики произвольного вида в правостороннюю
- •Конечные распознаватели. Основные понятия
- •Преобразование недетерминированных конечных распознавателей с -переходами в детерминированные
- •Эквивалентность состояний конечных детерминированных распознавателей
- •Эквивалентность конечных детерминированных распознавателей
- •Минимизация конечных детерминированных распознавателей
- •Регулярные множества и регулярные выражения
- •Регулярные выражения и конечные распознаватели
- •Получение регулярного выражения из конечного распознавателя
- •Построение конечного распознавателя по регулярному выражению
- •Конечные распознаватели и регулярные грамматики
- •Получение грамматики из конечного распознавателя
- •Построение конечных распознавателей по регулярным грамматикам
- •Ещё один способ взаимного преобразования право- и левосторонних грамматик
- •Программная реализация конечных детерминированных распознавателей
- •Лексический анализ
- •Принципы построения лексических анализаторов
- •Определение границ лексем
- •Выполнение действий, связанных с лексемами
- •Выделение ключевых слов
- •Программная реализация лексических анализаторов
- •Глава 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) Аt , где А – нетерминал, t – терминал, - цепочка нетерминалов, возможно пустая;
2) S , если пустая цепочка принадлежит языку, причём начальный нетерминал S не встречается в правых частях правил.
Другими словами, это грамматика без -правил, а правые части правил содержат только один терминал, занимающий крайнюю левую позицию.
Для преобразования произвольной грамматики в НФГ предварительно нужно привести грамматику и устранить левую рекурсию.
Алгоритм преобразования приведённой грамматики без левой рекурсии в НФГ.
1. Упорядочить правила грамматики следующим образом:
а) последовательно выписать правила вида АВ в таком порядке, чтобы для любого правила выполнялось условие:
правила с нетерминалом В в левой части должны располагаться ниже правила АВ , а правила с краем А – выше правила АВ .
б) последовательно выписать правила вида Аt ;
2. Просматривая правила грамматики снизу вверх, выполнять замену края, пока это возможно.
3. Если в правой части некоторого правила встречается терминал t , занимающий не крайнюю левую позицию, и в грамматике есть одиночное правило Аt , то терминал t заменить нетерминалом А , если же в грамматике нет одиночного правило Аt , то ввести его и терминал t заменить на нетерминал А . Выполнять п.3 , пока это возможно.
Пример.
Преобразовать заданную грамматику в НФГ.
Выполнение пунктов 1 и 2 алгоритма представлено в таблице.
Исходная граммати-ка |
Правила упорядо-чены |
Выполнение замены края |
Результат п.2 |
||
SAC |
BSb |
BSb |
BSb |
BaBCb |
SaBC |
CAaC |
SAC |
SAC |
SaBC |
BdCb |
SdC |
BSb |
CAaC |
CaBaC |
SdC |
SaBC |
CaBaC |
BbB |
BbB |
CdaC |
CaBaC |
SdC |
CdaC |
AaB |
AaB |
BbB |
CdaC |
CaBaC |
BaBCb |
Ad |
Ad |
AaB |
BbB |
CdaC |
BdCb |
|
|
Ad |
AaB |
BbB |
BbB |
|
|
|
Ad |
AaB |
AaB |
|
|
|
|
Ad |
Ad |
При выполнении п.3 алгоритма вводим два одиночных правила Db и Ea и в правых частях правил, полученных в результате п.2, заменяем терминалы b, расположенные не в крайней левой позиции, на нетерминал D, а терминалы а, расположенные не в крайней левой позиции, на нетерминал E. В итоге получаем грамматику в нормальной форме Грейбах:
SaBC BbB
SdC AaB
CaBEC Ad
CdEC Db
BaBCD Ea
BdCD
