- •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. Правильно построенные логические сети
4. Формальные порождающие грамматики
Порождающей грамматикой называется упорядоченная четверка G=< VN, VT, S, R>, где VT – алфавит терминальных или основных символов; VN — алфавит нетерминальных или вспомогательных символов (VTVN = ); S – начальный символ или аксиома, S VN, R – конечное множество правил или продукций вида , где (VTVN )* VN (VTVN )*, (VTVN )* – различные цепочки, а специальный символ, не принадлежащий VTVN и служащий для отделения левой части правила от правой . Такие символы, которые служат для описания языка, но не принадлежат самому языку, будем называть метасимволами. Определим, что цепочка 1 непосредственно выводима из цепочки 0 (обозначается 01 ), если существуют такие 1, 2, , , что 01 2, 11 2 и существует правило ( R). Иными словами 01, если в 0 найдется вхождение левой части какого-либо правила грамматики, а цепочка 1 получена заменой этого вхождения на правую часть правила.
Существенно, что при определении отношения непосредственной выводимости обозначаемого (, разумеется, также метасимвол) не указывается, какое правило нужно применять и к какому именно вхождению (если их несколько). Здесь проявляются характерные черты исчислений, к классу которых относятся и порождающие грамматики. Исчисления представляют собой "разрешения" в отличие от алгоритмов, являющихся "предписаниями".
Определим, что цепочка n выводима из цепочки 0 за один или несколько шагов или просто выводима (обозначается 0+n ), если существует последовательность цепочек 0, 1, 2,…, n (n>0), такая, что ii+1, i{0, …, n-1}. Эта последовательность называется выводом n из 0, а n – длиной вывода. Выводимость за n шагов иногда обозначается 0n n. Наконец, если 0+n или 0=n , то пишут 0*n.
Нетрудно видеть, что + есть транзитивное, а * – транзитивно-рефлексивное замыкание отношения .
Цепочка называется сентенциальной формой, если она совпадает или выводима из начального символа грамматики, т.е. если S * .
Множество цепочек в основном алфавите грамматики, выводимых из начального символа, иначе множество сентенциальных форм, состоящих из терминальных символов (иначе, сентенций), называется языком, порождаемым грамматикой G, и обозначается L(G).
L(G) = {x / S * x & xVT* }.
Справедливо, что для любого перечислимого множества слов М существует грамматика G, такая, что М = L(G).
Определим, что грамматики G1 и G2 эквивалентны, если L(G1 )=L(G2).
Например,
G1 = < {S}, {a}, S, { Sa, S a a S}>, L(G1)= {a 2n+1, n 0}.
G2 = < {S, A}, {0, 1}, S, R>, R = {S 1 A, A 1 A, A 0 A, A 0 }, L(G2) – множество четных двоичных чисел, больших нуля.
G3 = < {S, A}, {0, 1}, S, R>, R = {S 1 A 0, A 1 A, A 0 A, A }, L(G2) = L(G3), грамматики G2 и G3 эквивалентны.
Для сокращения записи грамматик и выводов будем изображать нетерминальные символы прописными буквами латинского алфавита А , В , С , … , S с индексами или без них, терминальные – строчными буквами a, b, c,… и цифрами. Прописными буквами U, V, Z будем обозначать символы, которые могут быть как терминальными, так и нетерминальными; строчными буквами u, v, x, y, z c индексами или без них – цепочки, составленные из терминальных символов, а буквами … – из любых символов. Кроме того, для обозначения правил 1, 2,…, n будем пользоваться записью 12…n .
Правила вида , где VT*, называются заключительными.
