
- •Введение
- •Формальные грамматики. Выводы Основные понятия
- •Способы задания языков
- •Операции над языками
- •Формальные грамматики. Выводы
- •Преобразования кс-грамматик Основные понятия
- •Устранение лишних символов
- •Исключение лишних правил
- •Исключение -правил
- •Устранение цепных правил
- •Выделение нетерминала
- •Левая факторизация
- •Устранение левой рекурсии
- •Устранение правой рекурсии
- •Нормальная форма Хомского
- •Нормальная форма Грейбах
- •Операторная кс-грамматика
- •Регулярные языки и конечные распознаватели Правосторонние грамматики
- •Левосторонние грамматики
- •Связь правосторонних и левосторонних грамматик
- •Преобразование кс-грамматики произвольного вида в правостороннюю
- •Конечные распознаватели. Основные понятия
- •Преобразование недетерминированных конечных распознавателей с -переходами в детерминированные
- •Эквивалентность состояний конечных детерминированных распознавателей
- •Эквивалентность конечных детерминированных распознавателей
- •Минимизация конечных детерминированных распознавателей
- •Регулярные множества и регулярные выражения
- •Регулярные выражения и конечные распознаватели
- •Получение регулярного выражения из конечного распознавателя
- •Построение конечного распознавателя по регулярному выражению
- •Конечные распознаватели и регулярные грамматики
- •Получение грамматики из конечного распознавателя
- •Построение конечных распознавателей по регулярным грамматикам
- •Ещё один способ взаимного преобразования право- и левосторонних грамматик
- •Программная реализация конечных детерминированных распознавателей
- •Лексический анализ
- •Принципы построения лексических анализаторов
- •Определение границ лексем
- •Выполнение действий, связанных с лексемами
- •Выделение ключевых слов
- •Программная реализация лексических анализаторов
- •Глава 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. Конфликты разбора типа сдвиг-свертка
Преобразования кс-грамматик Основные понятия
Грамматики Gi и GJ называются эквивалентными, если равны порождаемые ими языки. Получение грамматики GJ, эквивалентной исходной грамматике Gi , назовём эквивалентным преобразованием грамматики Gi в GJ. Преобразование грамматики Gi в GJ выполняется применением определённых правил преобразования. Множество правил образуют систему преобразований. Система преобразований называется полной, если для любых двух эквивалентных грамматик Gi и GJ существует последовательность правил из заданной системы преобразований, результатом применения которой к грамматике Gi является грамматика GJ. Для КС-грамматик не существует полной системы преобразований, следовательно рассматри-ваемые ниже правила преобразований не образуют полную систему преобра-зований, но обычно позволяют получить грамматику, эквивалентную исходной, обладающую заданными свойствами.
Устранение лишних символов
Среди символов КС-грамматики можно выделить две группы лишних символов:
1) бесплодные нетерминалы – это нетерминалы, которые не порожда-ют ни одной терминальной цепочки. Такие нетерминалы не могут участво-вать в выводе терминальных цепочек.
2) недостижимые символы – это символы (терминалы и нетерми-налы), которые не встречаются ни в одной цепочки (терминальной или промежуточной), выводимой из начального нетерминала.
Правила, в которые входят лишние символы (в левую или правую часть правила), можно исключить из множества правил грамматики.
Поиск бесплодных нетерминалов сводится к нахождению продук-тивных нетерминалов и исключению их из множества всех нетерминалов грамматики. Терминальный или нетерминальный символ называется продуктивным (живым), если из него выводится терминальная цепочка. Любой терминальный символ продуктивный. Нетерминальный символ А будет продуктивным, если существует правило А, в котором все символы в правой части продуктивны.
Алгоритм нахождения всех продуктивных нетерминалов.
1. Принять множество продуктивных нетерминалов Р=.
2. Если существует правило А, в котором все символы в правой части продуктивны, то нетерминал А включить в множество Р.
3. Повторять п.2, пока множество Р растёт.
Поиск недостижимых символов сводится к нахождению всех достижимых символов и исключению их из множества всех нетерминалов грамматики. Терминальный или нетерминальный символ называется достижимым, если он может появиться в какой-нибудь цепочке, выводимой из начального нетерминала. Начальный нетерминал - достижимый. Терминальный или нетерминальный символ будет достижимым, если он находится в правой части правила А и А – достижимый нетерминал.
Алгоритм нахождения всех достижимых символов.
1. Принять множество достижимых символов Р={S}, где S – начальный нетерминал.
2. Если существует правило А и нетерминал А принадлежит множеству Р, то все символы правой части включить в множество Р.
3. Повторять п.2, пока множество Р растёт.
Алгоритм устранения всех лишних символов.
1. В исходной грамматике G найти все бесплодные нетерминалы и исключить правила, связанные с ними. В результате получим грамматику G’ без бесплодных нетерминалов.
2. В грамматике G’ найти все недостижимые символы и исключить правила, связанные с ними. В результате получим грамматику G’’ без лишних символов.
После исключения бесплодных нетерминалов в грамматике могут появиться недостижимые символы, которые в исходной грамматике были достижимыми. Если же в грамматике нет бесплодных нетерминалов, то они не могут появиться в результате исключения недостижимых символов.
Пример устранения лишних символов.
Грамматика:
1. Sac 4. BaSA
2. SbA 5. CbC
3. AcBC 6. Cd
1. Поиск продуктивных нетерминалов.
В множество продуктивных нетерминалов Р включаем нетерминал S (правило 1) и нетерминал С (правило 6). Получаем Р={S,C} и увеличить множество Р не можем.
2. Поиск бесплодных нетерминалов.
Из множества всех нетерминалов исключаем все продуктивные и получаем множество {A,B} бесплодных нетерминалов.
3. Исключение бесплодных нетерминалов.
Исключаем правила 2, 3 и 4, т.к. они содержат бесплодные нетерминалы. Получаем грамматику:
1. Sac
5. CbC
6. Cd
4. Поиск достижимых символов.
Достижимыми символами являются S, a и c.
5. Поиск недостижимых символов.
Из множества всех символов исключаем все достижимые и получаем множество {C,b,d} недостижимых символов.
6. Исключение недостижимых символов.
Исключаем правила 5 и 6, т.к. они содержат недостижимые символы. Получаем грамматику:
1. Sac
Заметим, что в исходной грамматике все символы достижимы.