
- •Обзорная лекция по курсу «языки программирования и методы трансляции»
- •Основная литература
- •1 Описание языка программирования
- •2 Введение в трансляцию
- •3 Способы описания языка
- •4 Формальные языки и грамматики. Основные термины и определения
- •5 Порождающие грамматики (Грамматики н.Хомского1)
- •6 Классификация формальных грамматик
- •7 Автоматные грамматики и конечные автоматы
- •7.1. Механизмы распознавания и преобразования
- •7.2 Конечные автоматы
- •7.3 Способы задания конечных автоматов
- •Контекстно-свободные грамматики и языки
- •Проверка существования языка
- •Удаление бесполезных символов грамматики
- •Эквивалентные преобразования кс-грамматик
- •9.1 Устранение цепных правил
- •Удаление произвольного правила
- •9.3 Левая факторизация правил
- •9.4 Преобразование к нормальной форме Хомского
- •Распознающий автомат для кс- языков (автомат с магазинной памятью)
- •Разнозновидности мп-автоматов
- •11 Методы синтаксического анализа
- •Нисходящий разбор
- •Восходящий разбор
- •12 Генерация внутреннего представления программ
- •12.1 Польская запись
- •2 Алгоритм перевода на промежуточный язык
- •2.1 Полиз как промежуточный язык
Эквивалентные преобразования кс-грамматик
9.1 Устранение цепных правил
Цепное правило – это правило вида АВ, где А,В N. Цепные правила могут быть причиной нежелательных свойств грамматики, таких, например, как циклы. Алгоритм устранения цепных правил осуществляет замещение правой части каждого цепного правила, используя для этого не цепные правила.
Вход: КС-грамматика G=(N, T, P, S) без -правил.
Выход: Эквивалентная КС-грамматика G’=(N, T, P’, S) без цепных правил.
1. Для каждого нетерминала А вычислить NA = {B | A*B, где B N }:
Положить N0A={A}
Вычислить N1A = N0A {C | (BC) P, B N0A , C N }
Если N1A N0A , то положить N0A = N1A и перейти к п.1.2, иначе положить NA = N1A
2. Построить множество P’ так: если (В) P не является цепным правилом ( N), то включить в P’ правило А для каждого А, такого, что В NA, т.е.
P’={ А для всех (В) P , где N и В NA }
Пример: Преобразовать грамматику G с правилами:
G: S X
X Y
YY; | z
в эквивалентную грамматику без цепных правил:
Шаг алгоритма |
Действия и результаты |
1.1 |
N0S = {S} |
1.2 |
N1S = {S, X} |
1.3 |
N1S = N0S ? Нет N0S = N1S={S, X} |
1.2 |
N1S = {S, X, Y} |
1.3 |
N1S = N0S ? Нет N0S = N1S={S, X,Y} |
1.2 |
N1S = {S, X, Y} |
1.3 |
N1S = N0S ? Да NS ={S, X,Y} |
1.1 |
N0X = {X} |
1.2 |
N1X = {X,Y} |
1.3 |
N1X = N0X ? Нет N0X = N1X={X, Y} |
1.2 |
N1X = {X,Y} |
1.3 |
N1X = N0X ? Да NX ={X,Y} |
1.1 |
N0Y = {Y} |
1.2 |
N1Y = {Y} |
1.3 |
N1Y = N0Y ? Да NY ={Y} |
2 |
P’={SY;|z, XY; |z , YY; |z} |
Пример: Преобразовать грамматику G с правилами:
G: E E+T
ET
TT*P
TP
Pi
P(E)
После выполнения шага 1 алгоритма получаем: NE ={E, T, P}, NT ={T, P}, NP ={P}
Выберем первый нетерминал E из множества NE. Формируя множество правил , левая часть которых - нетерминальный символ Е, а правые части нецепных правил исходной грамматики, в левой части которых находятся символы из множества NE, получаем: { E E+T , ET*P, Ei, E(E)}. Таким же образом рассматриваем остальные символы из NE, затем символы из NT и NP .
Окончательно получаем P’={ E E+T , ET*P, Ei, E(E), TT*P, Ti, T(E), Pi, P(E)}
Удаление произвольного правила
Рассмотрим еще одно полезное преобразование грамматик – удаление произвольного правила вывода. Такое преобразование часто используется при приведении грамматики к заданному классу.
Алгоритм. Удаление произвольного правила вывода из Кс-грамматики
Вход: КС-грамматика G=(N, T, P, S) и правило вывода вида АВ Р, где А, В N и цепочки , (ТN)*.
Выход: КС-грамматика G'=(N, T, P’, S): L(G)=L(G’) и АВ Р'.
Описание алгоритма:
Пусть B1, B2, … Bk – все В-правила грамматики G. Построить P’ следующим образом:
P’=( P-{ АВ}) {А1 |2, … | k }
Положить G'=(N, T, P’, S)
Пример. Удалить правило P(E) из КС-грамматики с правилами:
E E+T
ET
TT*P
TP
Pi
P(E)
1. Е-правила грамматики G будут выглядеть следующим образом:
E E+T
ET
2. Из множества правил грамматики G необходимо удалить заданное правило P(E) и добавить P-правила: P (E+T) P(T). Новое множество правил грамматики P' имеет вид: { E E+T ET TT*P TP Pi P (E+T) P(T) }