
- •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. Приклади побудови спадного розпізнавача
I aAi aAai abAi abbI abba.
10.4.3. Граматики типу 2. Граматики типу 2 називають контекстно вільними (кв) граматиками, або безконтекстними граматиками.
Правила виведення таких граматик мають вигляд:
A ,
де A Va і (Vт Va).
Очевидно, що ці правила випливають із правил граматики типу 1 за умови, що 1 = 2 = $. Оскільки контекстні умови відсутні, то правила КВ–граматик виходять простіші, ніж правила граматик типу 1. Саме такі граматики використовують для опису мов програмування. Прикладом КВ–граматики може служити така граматика.
Г10.5: Vт = {a, b}, Va = {I},
R = {I aIa (1)
I bIb (2)
I aа (3)
I bb}. (4)
Ця граматика породжує мову, що складається з ланцюжків, кожний з яких у свою чергу складається з двох частин: ланцюжка Vт і дзеркального відображення цього ланцюжка '.
За допомогою правил цієї граматики може бути побудований, наприклад, ланцюжок:
I aIa abIba abaIaba ababbaba.
10.4.4. Граматики типу 3. Граматики типу 3 називають автоматними граматиками (а-граматиками). Правила виведення в таких граматиках мають вигляд:
Aa, або AaB, або ABa,
де a Vт, і A, BVa, причому граматика може мати тільки правила вигляду A aB – правосторонні правила, або тільки вигляду A Ba – лівосторонні правила. Прикладами автоматних граматик можуть бути правостороння граматика Г10.6 і лівостороння граматика Г10.7.
Г10.6: Vт = {a, b}, Va = {I, A, Z},
R = {I aI (1)
I aA (2)
A bA (3)
A aZ (4)
A bZ (5)
Z $}. (6)
Г10.7: Vт = {a, b}, Va = {I, A, Z},
R = {I Ab (1)
A Ab (2)
A Za (3)
Z Za (4)
Z $}. (5)
Ці граматики є еквівалентними і породжують мову
L(Г7) = {a...ab...b | n, m 0}.
Між множинами мов різних типів існує відношення включення:
{L типу 3} {L типу 2} {L типу 1} {L типу 0}.
Доведено, що існують: мови типу 0, що не є мовами типу 1; мови типу 2, що не є мовами типу 1; мови типу 3, які не є мовами типу 2.
З огляду на те, що найбільш практично застосовуються граматики типу 2 і типу 3, подальший виклад присвячується розгляду саме цих типів граматик.
10.5. Виведення у кв-граматиках і правила побудови дерева виведення
Формальні граматики дозволяють задавати мови, що являють собою множину ланцюжків, побудованих за визначеними правилами. Використовуваний спосіб завдання дозволяє будь-як побудувати ланцюжок, що належить мові. Щоб зробити процес побудови, що називається наочним виведенням, його зображають у вигляді графа, точніше, у вигляді дерева, яке називають синтаксичним деревом, або деревом виведення. З огляду на те, що виведення будь-якого ланцюжка, який належить мові, породжуваній заданою граматикою, повинно починатися з початкового символу, правила побудови дерева можна сформулювати так:
1) як початок чи вершину кореня дерева візьмемо вершину, яку позначимо початковим символом граматики I; ця вершина утворить нульовий ярус дерева;
2) якщо при виведенні ланцюжка, на черговому кроці використовується правило граматики A, і вершина, позначена нетермінальним символом A, розташована на ярусі з номером k – 1, то до побудованого дерева потрібно додати стільки вершин, скільки міститься символів у ланцюжку ; треба розташувати ці вершини на ярусі k , позначити їх символами ланцюжка і з'єднати ці вершини дугами з вершиною A.
Результатом виведення по дереву є множина кінцевих вузлів – листів, що виписуються при обході дерева ліворуч – униз і праворуч – нагору.
Розглянемо, наприклад, граматику Г10.10.
Г10.8: Vт = {a, b}, Va = {I},
R = {I aIb (1)
I ab}, (2)
яка породжує мову L(Г8) = {aa...abb...b}, де а і b повторюються по n разів (n = 1, 2, ...).
Виведення ланцюжка за допомогою правил цієї граматики має вигляд дерева, відображеного на Рис. 10.1.
Рисунок 10.1 – Виведення ланцюжка aaabbb
10.5.1. Синтаксичний розбір. Виведення ланцюжка за допомогою правил граматики може бути задане не тільки у вигляді синтаксичного дерева. Якщо пронумерувати правила граматики, то послідовність номерів правил, які використані, також задає виведення.
Визначення. Послідовність номерів правил граматики Г, застосування яких дозволяє побудувати виведення заданого ланцюжка з початкового символу граматики, називається синтаксичним розбором ланцюжка.
Наприклад, у граматиці Г10.9:
Г10.9: Vт = {i, +, *, (, )}, Va = {E, T, P}
R = {E E + T (1)
E T (2)
T T * P (3)
T P (4)
P (E) (5)
P i}, (6)
правила якої пронумеровані, виведення ланцюжка i * i + i буде таким:
E E + T T + T T * P + T P * P + T i * P + T i * i + T
i * i +P i * i + i
Отже послідовність використання правил є такою – 1, 2, 3, 4, 6, 6, 4, 6.
Якщо в процесі побудови виведення з'являються проміжні ланцюжки, що містять кілька нетермінальних символів, то можна продовжувати виведення, заміняючи кожний з ланцюжків. Таким чином, ті самі правила можуть бути використані при виведенні ланцюжка у будь-якому порядку.
Наприклад, виведення ланцюжка i + i в граматиці Г10.9 може бути отримане декількома різними способами.