
- •Автор: старший преподаватель кафедры Прикладной Математики и Информатики им. Ю.В.Кожевникова Сергей Викторович Сотников.
- •2.3. Общие методы синтаксического анализа 81
- •1. Класс контекстно-свободных языков (V-3.0 28.02.2009)
- •1.1. Свойства кс-языков
- •1.1.1. Теорема Огдена. Лемма о разрастании кс-языков
- •1.2. Приведение кс-грамматик
- •Удаление недостижимых символов;
- •Удаление бесплодных (бесполезных) символов;
- •Удаление цепных правил;
- •1.2.5. Удаление цепных правил
- •1.2.5.1. Алгоритм удаления цепных правил
- •1.3. Нормализация грамматик (Приведение кс-грамматик к нормальной форме)
- •1.3.1.1. Алгоритм преобразования к нормальной форме Хомского
- •1.3.2.1. Устранение левой (правой) рекурсии
- •1.3.2.1.1. Алгоритм устранения левой рекурсии
- •1.3.2.2. Преобразование нелеворекурсивной приведенной кс-грамматики к нормальной форме Грейбах
- •1.3.2.2.1. Алгоритм преобразования нелеворекурсивной приведенной кс-грамматики к нормальной форме Грейбах
- •1.3.2.3. Другой способ преобразования кс-грамматики к нормальной форме Грейбах (Метод Розенкранца)
- •1.3.2.3.1. Алгоритм метода Розенкранца
- •1.4. Автоматы с магазинной памятью (mп-автоматы)
- •1.5. Соотношения между различными мп-автоматами
- •1.5.1. Алгоритм построения мп-автомата по расширенному мп-автомату
- •1.5.2. Алгоритм построения расширенного мп-автомата по мп-автомату
- •1.5.3.1. Алгоритм построения по мп-автомату мп-автомата, допускающего цепочки опустошением магазина
- •1.5.3.1. Алгоритм построения мп-автомата по мп-автомату, допускающего цепочки опустошением магазина
- •1.6. Эквивалентность мп-автоматов и кс-грамматик
- •1.6.1. Алгоритм построения мп-автомата по произвольной кс-грамматике
- •1.6.2. Алгоритм построения расширенного мп-автомата по произвольной кс-грамматике
- •1.6.3. Алгоритм построения кс-грамматики для произвольного мп-автомата
- •1.6.4. Алгоритм построения кс-грамматики для произвольного расширенного мп-автомата
- •2. Методы трансляции
- •2.1. Теория перевода
- •2.1.1. Формализмы, используемые для определения перевода
- •2.1.1.1. Перевод и семантика
- •2.1.1.2. Схемы синтаксически управляемого перевода ( су-схемы)
- •2.1.1.3. Конечные преобразователи
- •2.1.1.4. Преобразователь с магазинной памятью
- •2.1.1.5. Эквивалентность простых су-схем и преобразователей с магазинной памятью
- •2.1.1.5.1. Алгоритм построения мп-преобразователя для простой су-схемы
- •2.1.1.5.2. Алгоритм построения простой су-схемы по мп-преобразователю
- •2.1.2. Лексический анализ
- •2.1.2.1. Непрямой лексический анализ
- •2.1.2.2. Прямой лексический анализ
- •2.1.2.3. Программное моделирование конечных преобразователей
- •2.1.3. Синтаксический анализ
- •2.1.3.1. Определение разбора
- •2.2. Общие методы синтаксического анализа
- •2.2.1. Синтаксический анализ с возвратами
- •2.2.1.1. Алгоритм нисходящего разбора с возвратами
- •2.2.1.2. Проблемы алгоритм нисходящего разбора с возвратами
- •2.2.1.3. Алгоритм восходящего разбора с возвратами
- •Синтаксический анализ с возвратами
- •2.3. Общие методы синтаксического анализа универсальные методы синтаксического анализа. Табличные методы синтаксического анализа Алгоритм Кока-Янгера-Касами
- •Алгоритм разбора Кока-Янгера-Касами
- •Алгоритм нахождения левого разбора по таблице разбора
- •Алгоритм Эрли
- •Алгоритм разбора Эрли
- •Алгоритм построения правого разбора по списку разбора
1.3.2.1. Устранение левой (правой) рекурсии
Определение: В КС-грамматике символ называется рекурсивным, если для него существует вывод вида
.
Определение: Если в КС-грамматике существует вывод вида
,
где
,
,
то такая рекурсия называется левой, соответственно символ называется леворекурсивным.
Определение: Если в КС-грамматике существует вывод вида
,
где
,
,
то такая рекурсия называется правой, а символ называется праворекурсивным.
Определение: В КС-грамматике существует вывод вида . Если и , то имеет место цикл (цепные правила).
Определение: Грамматика , в которой имеется левая (правая) рекурсия относительно хотя бы одного нетерминала, называется леворекурсивной (праворекурсивной).
Определение: Грамматика , в которой отсутствует левая (правая) рекурсия относительно любого нетерминала, называется нелеворекурсивной (неправорекурсивной).
1.3.2.1.1. Алгоритм устранения левой рекурсии
Домашнее задание: Написать алгоритм устранения правой рекурсии.
Вход: Приведенная КС-грамматика .
Выход: Грамматика без левой рекурсии (нелеворекурсивная грамматика).
Метод:
Пусть
(перенумеруем все нетерминалы).
Идея метода:
Преобразуем грамматику
так, чтобы в правиле
цепочка
начиналась либо с терминала, либо с
нетерминала
такого, что
и установим
.
Рассмотрим множество правил для текущего нетерминала
. Если является нелеворекурсивным, то никаких изменений во множестве правил не производим. Если является леворекурсивным символом, то множество правил для этого нетерминала можно представить следующим образом
.
Тогда вместо этих правил во множество добавляем правила вида
;
,
где
- это новый нетерминал, который добавляется
во множество нетерминалов
;
- правые части правил для нетерминала
,
которые начинаются либо с терминала,
либо с нетерминала, номер которого
больше номера текущего нетерминала,
т.е. с нетерминала
,
где
;
Если
, то алгоритм останавливается, и полученная грамматика будет результирующей ( );
если
,
то
,
вспомогательная переменная
и переходим к шагу 4;
Для нетерминала находим все правила вида
, если
, то делаем замену нетерминала в этих правилах, на правые части правил для нетерминала , т.е. заменяется правилами
, где
все -правила. Так как правая часть -правила начинается с терминала, или с , где
, то и правая часть каждого -правила будет обладать этим свойством;
Если
, то переходим к шагу 2,
если
,
то
и переходим к шагу 4.
Пример :
Выполнить устранение левой рекурсии в грамматике с правилами вывода вида
,
,
,
где
- целевой символ.
Решение:
1.
,
установим
;
2. Рассмотрим множество правил для нетерминала , он является леворекурсивным символом, тогда множество правил для него запишется так
.
Добавляем во множество правила вида
во множество
;
3. Так как , делаем приращение и задаем вспомогательную переменную ;
4. Для нетерминала находим правила вида и если , то сделаем замену, таких правил для текущего нетерминала нет;
5. Так как , то переходим к шагу 2;
2. Рассмотрим множество правил для нетерминала , он является леворекурсивным символом, тогда множество правил для него запишется так
.
Добавляем во
множество
правила вида
во множество
;
3. Так как , делаем приращение и задаем вспомогательную переменную ;
4. Для нетерминала находим правила вида и если , то сделаем замену, такие правила есть, тогда произведем замену правила вида
на правило вида
;
5. Так как , то осуществляем приращение вспомогательной переменной переходим к шагу 4;
4. Для нетерминала находим правила вида и если , то сделаем замену, такие правила есть, тогда произведем замену правила вида
;
на правила вида
;
5. Так как , то переходим к шагу 2;
2. Рассмотрим
множество правил для нетерминала
,
он является леворекурсивным символом,
тогда множество правил для него запишется
так
.
Добавляем во множество правила вида
;
.
Множество
;
Так как , алгоритм останавливается, результирующая грамматика примет вид
,
где
;
;
;
.
Домашнее задание: Привести грамматику к нелеворекурсивному виду.
.
Домашнее задание: Привести грамматику к неправорекурсивному виду.
.
Определение: КС-грамматика называется грамматикой в нормальной форме Грейбах, если множество правил данной грамматики удовлетворяет следующим условиям
1.
;
,
,
;
2. ,
где
1)
;
2) - единственное правило такого вида;
3) - целевой символ данной грамматики;
4) - не встречается в правых частях других правил.