ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 17.04.2019

Просмотров: 403

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Розв'язати цю задачу можна двома способами.

1. Розбір зверху вниз. Оскільки є лише одна продукція з початковим символом S у лі­вій частині, то почнемо виведення з S  AB. Далі використаємо продукцію  Ca.Отже, S  AB  CaB. Позаяк ланцюжок cbab починається із символів cb, то, використавши продукцію  cb, одержимо S  AB  CaB  cbaB. Завершуємо виведення
застосуванням продукції B b:

S AB CaB cbaB cbab

Отже, ланцюжок cbab належить мові L(G).

2. Розбір знизу вверх. Почнемо з ланцюжка cbab, який потрібно вивести. Можна використати продукцію  cb; отже, Cab cbab. Застосувавши продукцію A Ca, отримаємо Ab  Cab  cbab. Тепер використаємо продукцію  b; отже, AB  Ab  Cab  cbab. Нарешті, застосуємо продукцію S AB;

S AB Ab Cab cbab

Дерево виведення для рядка cbab в граматиці G зображено на рис. 37.3.

Рис 37.3.

Означення 37.6. Виведення називають еквівалентними, якщо їм відповідають однакові дерева.

Перевага дерева виведення порівняно з виведенням його компактність. Дерево на рис. 37.3 має вісім вершин, а відповідні виведення 18 або 16 символів.

Взаємно однозначної відповідності між ланцюжками мови L і деревами виведення в граматиці G, яка породжує L, може й не бути.

Означення 37.7. Контекстно вільну граматику G називають неоднозначною, якщо існує хоча б один ланцюжок у мові L(G), який має в G більше одного дерева виведення.

Розглянемо граматику G = (V, T, S, P), де V = {S, a, b, c, +, , *, /, (, )}, T = {a, b, c, +, , *, /, (, )}, P = {S S+S, S SS, S S*S, S S/S, S (S), S a, S b, S c}. Ця граматика породжує мову арифметичних виразів, але вона неоднозначна. Вираз a*b + c має в ній два дерева виведення (рис. 37.4).

Неоднозначність мови призводить до незручностей у її використанні. Річ у тому, що дерево виведення основний засіб інтерпретації ланцюжка; тому синтак­сична неоднозначність (тобто наявність декількох дерев виведення) ланцюжка спричинює її семантичну неоднозначність наявність різних інтерпретацій. Наприклад, для ланцюжка a*b + c з попереднього прикладу різні дерева виведення ін­терпретовано як різні способи розставлення дужок: (a*b) + c в першому ви­падку й a * (b + c) в другому. Це зумовлює різну послідовність операцій і, від­повідно, різні результати обчислень. Щоб забезпечити однозначність, достатньо явно ввести дужки після кожної неодномісної операції в мовах формул (логічних, арифметичних, алгебричних тощо). Граматика з дужками хоча й призводить до надлишкових дужок у формулах, однак дає змогу змен­шити кількість нетермінальних символів і тим самим спростити синтаксичну структуру формули, задану її деревом.

Рис. 37.4.

37.5 Форми Бекуса-Наура

Для граматик типу 2 (контекстно вільних), окрім звичайного, є й інший спосіб подання форми Бекуса-Наура. У лівій частині продукцій граматик типу 2 один символ (нетермінальний). Замість того щоб виписувати окремо всі про­дукції, можна об'єднати в один вираз продукції з однаковими символами в лі­вій частині. Тоді замість символу в продукціях використовують символ ::=. Усі нетермінали в цьому разі беруть у трикутні дужки . Праві частини продукцій в одному виразі відокремлюють одну від одної символом |.


Наприклад, три продукції A Aa, A a, A AB можна подати одним таким виразом у формі Бекуса-Наура: A ::= Aa | a | AB.