
- •10. Формальні мови і граматики
- •10.2. Приклади, що ілюструють первинні поняття
- •I aA aаA aааA ... ,
- •I aAi aAai abAi abbI abba.
- •10.4.3. Граматики типу 2. Граматики типу 2 називають контекстно вільними (кв) граматиками, або безконтекстними граматиками.
- •I aIa abIba abaIaba ababbaba.
- •10.4.4. Граматики типу 3. Граматики типу 3 називають автоматними граматиками (а-граматиками). Правила виведення в таких граматиках мають вигляд:
- •10.5. Виведення у кв-граматиках і правила побудови дерева виведення
- •10.5.2. Ліве і праве виведення. Серед різних типів виведення найбільший інтерес становлять наступні два типи виведення.
- •10.6. Неоднозначні та еквівалентні граматики
- •10.7. Способи завдання схем граматик
- •10.7.2. Опис списків. Розглянемо побудову граматик для послідовностей символів і послідовностей символів з роздільниками, тобто для списків.
- •Cинтаксичний розбір ідентифікатора ab12 буде таким: [1, 2.1, 5.1, 2.1, 5.2, 2.2, 4.2, 2.2, 4.3, 3].
- •11. Контекстно-вільні граматики і автомати
- •11.1. Приведені граматики
- •Приклад. Маємо граматику
- •11.2. Виключення ліворекурсивних правил
- •11.3. Виключення ланцюгових правил
- •11.4. Магазинні автомати
- •12. Спадні розпізнавачі
- •12.1. Розділені граматики
- •12.2. Побудова детермінованого спадного розпізнавача
- •12.3. Слабко-розділені граматики
- •12.5. Побудова магазинного автомата
- •12.6. Приклади побудови спадного розпізнавача
12.3. Слабко-розділені граматики
Використовуючи введені поняття, можна дати визначення слабко-розділеної граматики.
КВ-граматика називається слабко-розділеною, якщо виконуються такі три умови:
- права частина кожного правила являє собою або порожній ланцюжок $, або починається з термінального символу;
- якщо два правила мають однакові ліві частини, то праві частини правил повинні починатися різними символами;
- множина ВИБІР, побудована для правил з однаковою лівою частиною, не містить однакових елементів.
12.4. LL(1)-граматики
Розділені і слабко-розділені граматики є підкласом граматик більш загального виду, що називаються LL(1)-граматиками. Граматика називається LL(1)-граматикою за умов:
- права частина кожного правила являє собою або порожній ланцюжок $, або починається з термінального чи нетермінального символу;
- якщо два правила мають однакові ліві частини, то праві частини правил повинні починатися різними символами;
- множина ВИБІР, побудована для правил з однаковою лівою частиною, не містить однакових елементів.
12.5. Побудова магазинного автомата
Для граматик, що відповідають умовам LL(1)-граматик, справедливе наступне твердження: для кожної LL(1)-граматики можна побудувати детермінований магазинний автомат М, що допускає мову, породжувану даною граматикою:
L(Г) = L(М).
Задача побудови магазинного автомата для заданої LL(1)-граматики формулюється таким чином.
Задано граматику Г = {Vт, Va, I, R}, потрібно визначити об'єкти, що визначають автомат М = {P, S, s, F, H, h0, f}.
З огляду на те, що автомат повинен допускати ланцюжки мови, породжуваної заданою граматикою, приймемо P = Vт. Щоб спростити опис автомата, припустимо, що він має один стан s, який є і початковим і заключним, тобто – S = {s} і F = {s}.
В якості магазинного алфавіту приймемо таке об'єднання:
H = {Vт Va {h0}}.
Побудову функцій переходів виконаємо з використанням множин ВИБІР правил заданої граматики:
1) Для кожного правила граматики, що починається термінальним символом вигляду A b, побудуємо команду автомата
f(s, b, A) = (s, α'),
де α' є дзеркальним відображенням ланцюжка α.
2) Для кожного правила граматики, що починається нетермінальним символом вигляду A→ Bα побудуємо команду автомата
f*(s, x, A) = (s, Bα')
де f* – команда автомата без зрушення вхідної головки, α' – дзеркальне відображення ланцюжка α, х – елемент множини ВИБІР. Кількість команд, які необхідно побудувати для заданого правила, визначається числом елементів множини ВИБІР для цього правила. Команди магазинного автомата, що працюють без зрушення вхідної головки, виконують заміну нетермінального символу, який відповідає лівій частині правила, дзеркальним відображенням ланцюжка, яка відповідає правій частини цього правила.
3) Для кожного правила граматики, що анулює (A → $) побудуємо команди автомата без зрушення вхідної головки
f*(s, x, A) = (s, $)
де x – елемент множини ВИБІР(A → $). Кількість таких команд визначається числом елементів множини ВИБІР для цього правила.
4) Для кожного термінального символу b, розташованого в середині або на кінці правих частин правил граматики, побудуємо команду
f(s, b, b) = (s0, $).
5) Для переходу в заключний стан побудуємо команду
f*(s, $, h0) = (s0, $, $).
Як початкову конфігурацію автомата умовимося використовувати такий вираз з заданим вхідним ланцюжком µ:
(s, µ, h0I).