
- •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. Приклади побудови спадного розпізнавача
10.5.2. Ліве і праве виведення. Серед різних типів виведення найбільший інтерес становлять наступні два типи виведення.
Визначення. Якщо під час побудови виведення ланцюжка при застосуванні кожного правила заміняється самий лівий нетермінальний символ, то таке виведення називається лівим, або лівостороннім виведенням . Але, якщо при побудові виведення завжди заміняється самий правий нетермінальний символ проміжного ланцюжка, то таке виведення називається правим, або правостороннім виведенням .
Наприклад, вище наведене виведення ланцюжка i * i + i в граматиці Г10.9 є лівостороннім виведенням. Слід зазначити, що різним виведенням ланцюжка i + i в граматиці Г10.9 відповідає те ж саме синтаксичне дерево. Аналогічна ситуація має місце і при виведенні ланцюжка i * i + i.
10.6. Неоднозначні та еквівалентні граматики
Існують граматики, в яких той самий ланцюжок може бути отриманий за допомогою різних виведень. Наприклад, у граматиці Г10.10 ланцюжок abc може бути отриманий за допомогою двох різних виведень, і, отже, їм відповідають два різних синтаксичних дерева.
Г10.10: Vт = {a, b, c, d}, Va = {I, A, B},
R = {I AB (1)
A a (2)
A ac (3)
B b (4)
B cb}. (5)
Перше виведення цього ланцюжка має вигляд:
1) I AB Ab acb,
а друге можна одержати так:
2) I AB Acb acb.
Цим виведенням відповідають різні синтаксичні дерева і розбори (Рис. 6.2).
Рисунок 10.2.– Синтаксичні дерева і розбори виразу acb
Наступна граматика також допускає побудову одного і того ж ланцюжка за допомогою двох виведень, що мають різні синтаксичні дерева.
Г10.11: Vт = {0, +}, Va = {I},
R = {I 0 (1)
I I + 0 (2)
I 0 + I}. (3)
Два виведення цієї граматики, що породжують однакові ланцюжки, мають вигляд:
1) II + 0I + 0 + 0 0 + 0 + 0,
2) I0 + I 0 + 0 + I 0 + 0 + 0,
а синтаксичні дерева, що відповідають цим виведенням, зображені на Рис. 10.3.
Рисунок. 10.3. Синтаксичні дерева виведення виразу: 0 + 0 + 0
Розглянута властивість граматик називається неоднозначністю. Вона може бути визначена в такий спосіб.
Визначення. Ланцюжок мови L(Г) називається неоднозначним, якщо для його виведення існує більш ніж одне синтаксичне дерево. Якщо граматика Г породжує неоднозначний ланцюжок, то вона називається неоднозначною.
Неоднозначність може існувати не тільки в штучних мовах. Добре відомо, що в природних мовах можуть бути пропозиції, які допускають неоднозначне написання. Наприклад, у фразі "Вино забруднило вікно" не ясно, що є підметом, а що доповненням. Іншим прикладом служить англійська фраза: "They are flying planes", яка може бути зрозуміла подвійно: “Вони пілотують літак” або “Це літаки, що летять”.
Властивість неоднозначності є вкрай небажаною для штучних мов, оскільки вона не дозволяє однозначно побудувати дерево виведення за заданим ланцюжком мови.
У загальному випадку можна зробити такий висновок:
1) кожному ланцюжку, виведеному в граматиці, можуть відповідати одне або кілька синтаксичних дерев;
2) кожному синтаксичному дереву можуть відповідати кілька виведень;
3) кожному синтаксичному дереву відповідають єдине праве і єдине ліве виведення.
Крім того, варто підкреслити, що та сама мова може бути отримана за допомогою різних граматик.
Визначення. Дві граматики – Г1 і Г2 – називаються еквівалентними, якщо вони породжують одну і ту ж саму мову, тобто L(Г1) = L(Г2).