- •Введение
- •Формальные грамматики. Выводы Основные понятия
- •Способы задания языков
- •Операции над языками
- •Формальные грамматики. Выводы
- •Преобразования кс-грамматик Основные понятия
- •Устранение лишних символов
- •Исключение лишних правил
- •Исключение -правил
- •Устранение цепных правил
- •Выделение нетерминала
- •Левая факторизация
- •Устранение левой рекурсии
- •Устранение правой рекурсии
- •Нормальная форма Хомского
- •Нормальная форма Грейбах
- •Операторная кс-грамматика
- •Регулярные языки и конечные распознаватели Правосторонние грамматики
- •Левосторонние грамматики
- •Связь правосторонних и левосторонних грамматик
- •Преобразование кс-грамматики произвольного вида в правостороннюю
- •Конечные распознаватели. Основные понятия
- •Преобразование недетерминированных конечных распознавателей с -переходами в детерминированные
- •Эквивалентность состояний конечных детерминированных распознавателей
- •Эквивалентность конечных детерминированных распознавателей
- •Минимизация конечных детерминированных распознавателей
- •Регулярные множества и регулярные выражения
- •Регулярные выражения и конечные распознаватели
- •Получение регулярного выражения из конечного распознавателя
- •Построение конечного распознавателя по регулярному выражению
- •Конечные распознаватели и регулярные грамматики
- •Получение грамматики из конечного распознавателя
- •Построение конечных распознавателей по регулярным грамматикам
- •Ещё один способ взаимного преобразования право- и левосторонних грамматик
- •Программная реализация конечных детерминированных распознавателей
- •Лексический анализ
- •Принципы построения лексических анализаторов
- •Определение границ лексем
- •Выполнение действий, связанных с лексемами
- •Выделение ключевых слов
- •Программная реализация лексических анализаторов
- •Глава 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. Исключить из правил грамматики все нецепные правила.
2. Принять множество МА ={А}, где А – нетерминал.
3. Если существует правило ВС и нетерминал В принадлежит множеству МА, то нетерминал С включить в множество МА .
4. Повторять п.3, пока множество МА растёт.
5. Исключить нетерминал А из множества МА.
Алгоритм устранения цепных правил.
1. Для каждого нетерминала А из множества нетерминалов грамма-тики найти множество МА.
2. Исключить из множества правил грамматики все цепные правила.
3. Для правил А из множества правил грамматики добавить прави-ло В, если А принадлежит множеству МВ .
Пример.
Грамматика с цепными правилами:
1. SS+T 4. TE
2. ST 5. E(S)
3. TT*E 6. Ea
1. Для каждого нетерминала находим множество нетерминалов, дости-жимых применением только цепных правил. Очевидно МS={T, E}, MT={E} и ME=.
2. Исключить из множества правил грамматики все цепные правила.
1. SS+T
3. TT*E
5. E(S)
6. Ea
3. Для правила 3. TT*E добавляем правило 3_1. ST*E, поскольку T принадлежит МS={T, E}.
Для правила 5. Е(S) добавляем правило 5_1. S(S) и 5_2. T(S), поскольку E принадлежит МS={T, E} и MT={E}.
Для правила 6. Ea добавляем правило 6_1. Sа и 6_2. Та, поскольку Е принадлежит МS={T, E} и MT={E}.
В результате получим:
1. SS+T
3. TT*E 3_1. ST*E
5. E(S) 5_1. S(S) 5_2. T(S)
6. Ea 6_1. Sа 6_2. Та
Замена
Если грамматика содержит n правил Аi, где 1in и других правил с левой частью А нет, и в грамматике есть правило ВА, то его можно заменить на n правил вида Вi, где 1in. Такое преобразование грамматики называется заменой, а нетерминал А в правиле ВА - заменяемым.
Если в грамматике есть хотя бы одно правило А, такое, что цепочка содержит в себе нетерминал А, то нетерминал А назовём саморекурсивным, в противном случае нетерминал А назовём несаморекурсивным.
Если грамматика содержит n правил Аi, где 1in, других правил с левой частью А нет, нетерминал А несаморекурсивный, то каждое вхождение нетерминала А в правые части правил можно заменить всеми способами на i, где 1in, а правила с левой частью А исключить из грамматики. Если n=1, то правило А единственное с правой частью А. Такое правило называется одиночным. Левая часть одиночного правила является несаморекурсивным нетерминалом (иначе он бесплодный). Замена всех вхождений нетерминалов, являющихся левыми частями одиночных правил, называется одиночной заменой.
В правиле грамматики назовём самое левое вхождение символа в его правую часть краем правила (-правило края не имеет). Если заменяемый нетерминал является краем правила, то такая замена называется заменой края.
Примеры.
а) замена края.
Исходная грамматика: Результат замены края:
1. Аа 1. Аа
2. АВс 2_1. АаАс
3. ВаА 2_2. АbВс
4. BbВ 3. ВаА
4. BbВ
Заменяемый нетерминал В (край второго правила) саморекурсивный, поэтому третье и четвёртое правило остаются в множестве правил грамматики.
Исходная грамматика: Результат замены края:
1. АсА 1. АсА
2. АВс 2_1. АаАс
3. ВаА 2_2. Аbс
4. Bb
Заменяемый нетерминал В (край второго правила) несаморекурсивный, поэтому третье и четвёртое правило исключаются из множества правил грамматики.
б) одиночная замена.
Исходная грамматика: Результат одиночной замены :
1. АаВВ 1. Аа аАb аАb
2. АвВ 2. АbаАb
3. Ас 3. Ас
4. BаАb
