
- •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. Приклади побудови спадного розпізнавача
Cинтаксичний розбір ідентифікатора ab12 буде таким: [1, 2.1, 5.1, 2.1, 5.2, 2.2, 4.2, 2.2, 4.3, 3].
10.7.5. Граматики для арифметичних виразів. Умовимося розглядати арифметичні вирази, які використовують тільки ідентифікатор і та знаки додавання і множення. Спочатку побудуємо граматику для виразів без дужок. Такі вирази являють собою ланцюжки, які можна розглядати як списки з роздільниками, в яких роль роздільників виконують знаки операцій (нетермінальний символ W). Відповідно до цієї аналогії одержуємо схему граматики.
Г10.20: R = {HіK (1)
KWіK (2)
K$ (3)
W+ (4)
W*}. (5)
Щоб побудувати граматику, яка допускає використання в арифметичних виразах дужок без вкладеності, подамо структуру таких виразів у вигляді списку з роздільниками, елементами якого є вираз (нетермінальний симол H) без дужок, або вираз, узятий в дужки. Роздільниками цього списку є знаки операцій (нетермінальний символ W, який визначений вище). Такій структурі відповідає наступна схема граматики:
Г10.21: R = {GHQ (6)
G(H)Q (7)
QWG (8)
Q$}. (9)
Для побудови граматики арифметичних виразів, що допускають застосування вкладених дужок, варто передбачити можливість використання як елемента списку не тільки виразу без дужок, але і виразу, в якому можуть бути використані дужки. Схема граматики, що враховує цю можливість, може бути записана у вигляді:
Г10.22: R = {EGP (10)
E(E)P (11)
PWE (12)
P$}. (13)
Виведення ланцюжка ((i + i) * i) буде таким: E (E)P (GP)P ((H)Q P )P((іK)Q P )P ((і W іK)Q P )P((і + іK)Q P )P((і + і)Q P )P((і + і) WG P )P((і + і) *G P )P((і + і) * HQP )P
((і + і) * іKQP)P((і + і) * іQP)P((і + і) * іP)P((і + і) * і)P((і + і) * і) та матиме синтаксичний розбір [11, 10, 7, 1, 2, 4, 3, 8, 5, 6, 1, 3, 9, 13, 13]
10.7.6. Граматика для описів. Для наочності сприйняття надалі введемо допущення, згідно з яким ключові слова мови програмування будемо вважати одним термінальним символом. Нехай потрібно побудувати граматику для опису змінних цілого та дійсного типів. Для спрощення, в якості змінних візьмемо тільки змінну і. Приклади ланцюжків, які описує дана граматика, наведені нижче:
1) int i, i, i, i; float i,i; int i; int i, i, i;
2) float i,i; int i, i, i; int i;
3) int i, i, i; float i, i; int i; float i, i; .
Тобто така граматика може генерувати ланцюжки, які містять послідовність списків змінних і типу 'float' або 'int'.
Перше правило граматики повинно починатися завданням типу float або int (нетермінальний символ В). Позначимо список змінних нетермінальним символом С. Виходячи з цього, маємо перше правило у вигляді Z BC. Структуру повного опису можна подати у вигляді двох вкладених списків з роздільниками. Внутрішній список (позначений нетермінальним символом L), розглянутий як елемент зовнішнього списку, являє собою опис змінних одного типу. Він має заголовок у вигляді покажчика типу, за яким випливає послідовність ідентифікаторів і, розділених комами. Зовнішній список (позначений нетермінальним символом С) використовує як роздільник крапку з комою.
Схема граматики розглянутого вигляду може бути записана так:
Г10.23: R = {Z BC (1)
C;BC (2)
C$ (3)
B real L (4)
B int L (5)
L iK (6)
K ,iK (7)
K$} (8)
10.7.7. Граматика, що описує умовний оператор. Припустимо, що розглядається умовний оператор, аналогічний тому, який використовується в алгоритмічній мові Паскаль, з ключовими словами if, then, else. Як умову (нетермінальний символ R) в таких операторах дозволяється використовувати відносини, які складаються з ідентифікатора a та числа від одного до дев’яти (нетермінальний символ D), з'єднаних знаками: =, >, <, <> (нетермінальний символ Z). Структура такого оператора (нетермінальний символ С) може бути короткою (без else) та довгою. Вважаємо, наприклад, що після слова then слідує оператор readln (F), а після слова else – оператор writeln(F), де F є нетермінальним символом, який задає один із двох ідентифікаторів b або c. Умовний оператор закінчується крапкою з комою, а саме – ‘;’.
Приклади ланцюжків, які описує дана граматика, наведені нижче:
if a > 9 then readln(b);
if a = 5 then readln(с);
if a <> 0 then readln(b) else writeln(с).
Схема граматики, що задає ці послідовності, може бути зображена так:
Г10.24: R = {I if P A (1)
P aZD (2)
Z< | > | <> | = (3)
D0 | 1 | 2 | … | 9 (4)
A then E C (5)
C else K; (6)
C; (7)
Ereadln (F) (8)
Kwriteln (F) (9)
F b | c} . (10)
Виведення ланцюжка if a < 0 then writeln(c); буде таким: Iif PA if aZD A if a < DA if a < 0 A if a < 0 then ECif a < 0 then readln (F) Cif a < 0 then readln (c) Cif a < 0 then readln (c); та матиме синтаксичний розбір [1, 2, 3, 4.1, 5, 8, 10.2, 7].
Контрольні запитання
1. Дайте визначення формальної граматики.
2. Які символи граматики називаються термінальними, а які –
нетермінальними?
3. Що називається мовою, яка породжується граматикою?
4. Які існують типи граматик?
5. Яка граматика називається контекстно-вільною граматикою?
6. Які граматики називаються неоднозначними?
7. Які існують способи завдання схем граматик?
8. Що являє собою ітераційна форма?
9. Які існують рекомендації стосовно побудови правил граматики?
10. Побудувати правила граматики, які будуть описувати прототипи функцій.