- •Введение
- •Формальные грамматики. Выводы Основные понятия
- •Способы задания языков
- •Операции над языками
- •Формальные грамматики. Выводы
- •Преобразования кс-грамматик Основные понятия
- •Устранение лишних символов
- •Исключение лишних правил
- •Исключение -правил
- •Устранение цепных правил
- •Выделение нетерминала
- •Левая факторизация
- •Устранение левой рекурсии
- •Устранение правой рекурсии
- •Нормальная форма Хомского
- •Нормальная форма Грейбах
- •Операторная кс-грамматика
- •Регулярные языки и конечные распознаватели Правосторонние грамматики
- •Левосторонние грамматики
- •Связь правосторонних и левосторонних грамматик
- •Преобразование кс-грамматики произвольного вида в правостороннюю
- •Конечные распознаватели. Основные понятия
- •Преобразование недетерминированных конечных распознавателей с -переходами в детерминированные
- •Эквивалентность состояний конечных детерминированных распознавателей
- •Эквивалентность конечных детерминированных распознавателей
- •Минимизация конечных детерминированных распознавателей
- •Регулярные множества и регулярные выражения
- •Регулярные выражения и конечные распознаватели
- •Получение регулярного выражения из конечного распознавателя
- •Построение конечного распознавателя по регулярному выражению
- •Конечные распознаватели и регулярные грамматики
- •Получение грамматики из конечного распознавателя
- •Построение конечных распознавателей по регулярным грамматикам
- •Ещё один способ взаимного преобразования право- и левосторонних грамматик
- •Программная реализация конечных детерминированных распознавателей
- •Лексический анализ
- •Принципы построения лексических анализаторов
- •Определение границ лексем
- •Выполнение действий, связанных с лексемами
- •Выделение ключевых слов
- •Программная реализация лексических анализаторов
- •Глава 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. Конфликты разбора типа сдвиг-свертка
Регулярные множества и регулярные выражения
Элементами регулярного множества являются цепочки символов, образованные из символов алфавита X, т.е. регулярное множество представляет собой некоторый формальный язык.
Регулярными множествами являются:
1. - пустое множество;
2. {} – множество, состоящее из одной пустой цепочки;
3. {x} – множество, состоящее из одной цепочки, представляющей собой один символ алфавита X;
4. если А и В – произвольные регулярные множества, то множества АВ, АВ, А*, В* также являются регулярными множествами;
5. ничто другое не является регулярным множеством.
Другими словами,
множество цепочек, образованных из
символов алфавита Х, является регулярным
тогда и только тогда, когда оно либо ,
либо {},
либо {х} для некоторого х
Х,
либо его можно получить из этих множеств
применением конечного числа операций
объединения, конкатенации и итерации.
Одним из способов задания регулярного множества является регулярное выражение.
Регулярными выражениями являются:
1. 0 – регулярное выражение, обозначающее ;
2. - регулярное выражение, обозначающее {};
3. х - регулярное выражение, обозначающее {x};
4. если а и b – регулярные выражения, обозначающие регулярные множества А и В, то:
а+в - регулярное выражение, обозначающее множество АВ;
ав - регулярное выражение, обозначающее множество АВ;
а* - регулярное выражение, обозначающее множество А*;
в* - регулярное выражение, обозначающее множество В*.
При записи регулярных выражений можно использовать круглые скобки, как и в обычных арифметических выражениях, для указания порядка выполнения операций. Для уменьшения числа скобок используются приоритеты операций: итерация самая приоритетная; менее приоритетна конкатенация; самый низкий приоритет у объединения. При отсутствии скобок операции выполняются слева направо с учётом приоритета.
Для сокращения записи регулярного выражения можно использовать систему выражений вида:
d1=r1
d2=r2
...
dn=rn
где di
- различные имена, а каждое ri
- регулярное выражение над символами
Х
{d1,d2,...,di-1},
т.е. символами основного алфавита и
ранее определенными символами. Таким
образом, для любого ri
можно построить регулярное выражение
над Х, повторно заменяя имена регулярных
выражений на обозначаемые ими регулярные
выражения.
Регулярные множества и регулярные выражения весьма близки. Но они представляют собой разные сущности: регулярное множество – это множество цепочек (в общем случае бесконечное), а регулярное выражение – это формула (составленная из конечного числа символов), схематично показывающая, как может быть построено соответствующее её регулярное множество.
Пример.
Регулярные выражения r1 и r2 в алфавите Х={ц, ., +, -}:
r1=((ц + (+ + -)ц)ц*. + (. + (+ + -).)ц)ц*
r2=цц*.ц* + (+ + -)цц*.ц* + (+ + -).цц* + .цц*
Одно и то же регулярное множество может быть представлено различными регулярными выражениями, например выражениями r1 и r2 (см. пример). Два регулярных выражения называются эквивалентными, если они определяют одно и то же регулярное множество (выражения r1 и r2 - эквивалентны, r1 = r2 ).
Для любых регулярных выражений a, b и c справедливы равенства:
1. a+b = b+a 6. a+a* = a* 11. a+a = a
2. a+(b+c) = (a+b)+c 7. aa* = a*a 12. 0a = a0 = 0
3. a(b+c) = ab+ac 8. a(ba)* = (ab)*a 13. 0+a = a+0 = a
4. (a+b)c = ac+bc 9. (a*)* = a* 14. a = a = a
5. a(bc) = (ab)c 10. 0* = 15. +a* = a*+ = a*
Эти равенства можно доказать, проверяя равенство соответствующих множеств цепочек. Их можно использовать для преобразования, в том числе и для упрощения регулярных выражений.
