- •1. Алфавит, слова, операции над словами
- •2. Языки. Операции над языками
- •2.1. Теоретико-множественные операции
- •2.2.Специфические операции
- •3. Абстрактные формальные системы
- •4. Формальные порождающие грамматики
- •5. Классификация грамматик
- •6.1. Диаграмма грамматики
- •6.2. Порождение и распознавание цепочек
- •6.3. Детерминизация недетерминированных автоматов
- •6.4. Автоматы с -переходами
- •Детерминизация автоматов с -переходами
- •Оптимизация автоматов с -переходами
- •6.5. Минимизация числа состояний автомата Минимизация автоматов методом таблиц различий
- •Минимизация автоматов по методу Хафмена
- •Минимизация не полностью определенных автоматов
- •6.6. Регулярные множества и регулярные выражения
- •6.7. Разрешимые проблемы для а-грамматик
- •7. Нотации для задания кс-грамматик
- •7.1. Математическая нотация
- •7.2. Бекусова нормальная форма
- •7.3. Расширенная форма Бекуса – Наура (рбнф)
- •7.4. Синтаксическая диаграмма
- •8. Структура цепочек. Су-схемы
- •9. Преобразования кс-грамматик
- •9.1 Устранение непроизводящих правил
- •Алгоритм устранения непроизводящих нетерминалов.
- •9.2. Устранение недостижимых нетерминалов
- •Алгоритм преобразования грамматики.
- •9.3. Устранение -правил
- •Алгоритм преобразования грамматики.
- •9.4. Устранение цепных правил (правил вида а в)
- •Алгоритм исключения цепных правил.
- •10. Разрешимые и неразрешимые свойства кс-грамматик
- •10.1. Разрешимые свойства кс-грамматик
- •10.2. Неразрешимые свойства кс-грамматик
- •11. Синтаксический анализ для кс-языков
- •11.1. Типовая задача синтаксического анализа
- •11.2. Ll(k)-грамматики
- •Использование ll(k) свойства при построении анализатора.
- •11.3. Восходящий анализ
- •Алгоритм разбора для гпп.
- •12.Элементы теории конечных автоматов
- •12.1. Автомат Мили
- •Метод Хафмена минимизации числа состояний автомата
- •12.2. Автоматы Мура
- •12.3. Частичные автоматы
- •13. Сети автоматов. Их анализ и синтез
- •13.1. Синхронные сети автоматов
- •13.2. Правильно построенные логические сети
9. Преобразования кс-грамматик
В данном разделе приводятся такие преобразования грамматик, которые не выводят нас из класса эквивалентности, т.е. грамматика G1 таким образом преобразуется в грамматику G2, чтобы L(G1)=L(G2).
9.1 Устранение непроизводящих правил
Непроизводящими правилами грамматики называются правила, применение которых никогда не приводит к построению терминальных цепочек.
Например, пусть правила для нетерминала А имеют следующий вид и других правил для А нет:
АА А В А
В этом случае, появившись в цепочке, нетерминал А никогда не будет заменен терминальной цепочкой. Естественно, в реальности ситуации бывают не столь простые.
Алгоритм устранения непроизводящих нетерминалов.
Пусть дана грамматика G = < VN, VT,S, R>, строится эквивалентная грамматика без непроизводящих символов G’ = < VN’, VT, S, R’>.
Построение множества производящих нетерминалов NR:
Строится множество NR1 = {A/ Aj, jVT*}
Последовательно строятся множества NRi+1={ A/ Aj, j(NRiVT)*}
Построение продолжается до тех пор, пока не получим NRi+1= NRi или же NRi= VN. Тогда NR = NRi.
Исключаем из грамматики все правила, в которых присутствуют нетерминалы из VN\ NR.
Н апример, рассмотрим грамматику G14 с множеством правил
S ABBC;
A AAAB;
B bBa;
СсСd AC.
Построим множество NR. NR1={B,C}, NR2={S, B, C}, NR3= NR2= =NR.
Правила преобразованной грамматики:
S
BC;
B bBa;
СсСd .
9.2. Устранение недостижимых нетерминалов
Недостижимыми нетерминалами называются нетерминалы, которые никогда не могут быть построены при построении вывода, начиная с начального символа грамматики.
Следует отметить, что такие нетерминалы в грамматиках встречаются в основном тогда, когда исключены некоторые непроизводящие символы, т.е. недостижимым нетерминал становится чаще всего после исключения некоторых непроизводящих символов. Например, если в грамматике правила для нетерминала А: АА А В А, и нетерминал В не встречается в других правых частях правил грамматики, то в этом случае, после устранения нетерминала А нетерминал В становится недостижимым, и, следовательно, его можно исключить из грамматики без изменения порождаемого ей языка. Построение множества недостижимых нетерминалов похоже на построение множества непроизводящих нетерминалов: строится множество всех достижимых нетерминалов, а затем исключаются все остальные нетерминалы грамматики.
Алгоритм преобразования грамматики.
Строится грамматика, в которой используются только достижимые нетерминалы (множество достижимых нетерминалов – D) , выглядит следующим образом:
Пусть дана грамматика G=< VN, VT, S, R>, строится эквивалентная грамматика без недостижимых нетерминалов G’ =< VN’, VT, S, R’>.
Построение множества достижимых нетерминалов:
Начальное значение D0=S.
Итерационное построение множества D:
Di+1= Di { A/B AR B Di}
Построение продолжается до тех пор, пока Di+1= Di или Di+1= =VN, в обоих случаях VN’= Di+1,
Построение множества правил преобразованной грамматики:
R’={ Ri / Ri=(A), A VN’, ( VN’ VT)*}. Построенная грамматика не содержит недостижимых нетерминалов.
Например, рассмотрим грамматику G15 с множеством правил
S A C B C;
A AD DF;
D aA D A;
F b F;
B bBa;
СсСd.
Тогда здесь A и D непроизводящие нетерминалы, после их устранения нетерминал F становится недостижимым, поэтому нетерминалы A, D и F могут быть исключены из грамматики с сохранением языка, порождаемого грамматикой.
Правила преобразованной грамматики:
S B C
B bBa
СсСd
