Зміст:
Проблеми загальних граматик
При виведенні слова в на кожному кроці безпосереднього виведення, коли ми беремо до уваги виділений нами нетермінал (в залежності від стратегії виведення), виникає питання, яку альтернативу для використати. З точки зору практики, нас цікавить така стратегія виведення в граматиці , коли кожний наступний крок безпосереднього виведення наближав би нас до мети. Ця стратегія дасть можливість виконати виведення в за час , де .
Зрозуміло, що не маючи інформації про структуру , досягнути вибраної нами мети в більшості випадків неможливо. Але ж тримати інформацію про все слово також недопустимо. З точки зору практики, отримати потрібний результат розумно при наявності локальної інформації, наприклад, поточних вхідних лексем програми ( — наперед фіксоване число) достатньо для організації виведення в за час . З точки зору синтаксичного аналізу слова мова ведеться про наступну ситуацію:
Зафіксуємо стратегію виведення: далі будемо розглядати лише лівосторонню стратегію виведення в . Тоді:
-
( — перший зліва направо нетермінал);
-
— термінальна частина слова , яку вже виведено (проаналізована частина слова);
-
результат , який потрібно ще вивести, виводиться зі слова ;
-
щоб зробити вірний крок виведення (без повернення назад) нам достатньо поточних вхідних символів з непроаналізованої частини програми .
Сформульовані умови забезпечує клас -граматик.
-граматики
КС-граматика називається -граматикою для деякого фіксованого , якщо для двох лівосторонніх виведень вигляду:
-
;
-
;
з випливає, що , де , а
Неформально, граматика буде -граматикою, якщо для слова достатньо перших символів (за умови, що вони існують) решти непроаналізованого слова щоб визначити, що з існує не більше однієї альтернативи виведення слова, що починається з та продовжується наступними термінальними символами.
Сформулюємо основні твердження стосовно класу -граматик:
-
Не існує алгоритма, який перевіряє належність КС-граматики класу -граматик.
-
Для кожного конкретного існує алгоритм, який перевіряє, чи є задана граматика -граматикою.
-
Якщо граматика є -граматикою, то вона є -граматикою, .
-
Клас -граматик — це підклас КС-граматик, який не покриває його.
Продемонструємо на прикладі справедливість останнього твердження. Розглянемо граматику з наступною схемою : .
Мова, яку породжує наведена вище граматика . Візьмемо виведення наступного слова . За визначенням -граматики якщо покласти то маємо отримати
Втім, для маємо:
Таким чином, КС-граматика не може бути -граматикою для жодного .
Як наслідок, КС-граматика , яка має ліворекурсивний нетермінал (нетермінал називається ліворекурсивним, якщо в граматиці існує вивід виду ), не може бути -граматикою.
З практичної точки зору в більшості випадків ми будемо користуватися -граматиками. У класі -граматик існує один цікавий підклас — це розподілені -граматики.
-граматика називаються розподіленою, якщо вона задовольняє наступним умовам:
-
у схемі граматики відсутні -правила (правила вигляду );
-
для нетермінала праві частини -правила починаються різними терміналами.
Зауважимо, що , де — бінарна операція над словарними множинами (мовами) визначена наступним чином:
Звідси маємо наступний тривіальний висновок: якщо , де , то
Для подальшого аналізу визначення -граматики розглянемо алгоритм обчислення функції , .
Алгоритм пошуку
Очевидно, що якщо , то при . Розглянемо алгоритм пошуку , .
Алгоритм [пошуку , ]: визначимо значення функції для кожного :
-
для всіх , .
-
.
-
.
-
для всіх .
Очевидно, що:
-
послідовність — монотонно зростаюча;
-
— послідовність обмежена зверху.
Тоді покладемо для кожного .
Приклад: знайти множину для нетерміналів граматики з наступною схемою правил:
Нехай , тоді маємо наступну таблицю:
Скористаємося визначенням сформулюємо необхідні й достатні умови, за яких КС-граматика буде -граматикою: для довільного виводу в граматиці вигляду та правила :
Вище сформульована умова для -граматик може бути перефразована з урахуванням визначення множини : для довільного виведення в граматиці вигляду та правила :
Оскільки , то остання умова є конструктивною умовою і може бути використана для перевірки, чи КС-граматика є -граматикою для фіксованого .
Сильні -граматики
КС-граматика називається сильною -граматикою, якщо для кожного правила вигляду виконується умова:
де , визначається так:
Неформально, відмінність сильних -граматик від звичайних -граматик полягає у тому, що наступне правило безпосереднього виведення, яке буде застосовано до можна визначити абстраговано від уже виведеної частини слова , розглядаючи тільки наступні символів які потрібно отримати після .
Операції та можна узагальнити для словарної множини , тоді:
Без доведення зафіксуємо наступні твердження:
-
кожна -граматика є сильною -граматикою;
-
існують -граматики , які не є сильними -граматиками.
Не всі граматики сильні
На прикладі продемонструємо останнє твердження. Нехай граматика визначена наступними правилами: , .
Відповідні множини , , , .
Перевіримо умову для сильної -граматики:
-
виконаємо перевірку -умови для правила :
-
виконаємо перевірку -умови для правила :
Висновок: вище наведена граматика не є сильною -граматикою. Перевіримо цю ж граматику на властивість -граматики. Тут ми маємо два різні варіанти виводу з :
-
: .
-
: .
Висновок: наведена вище граматика є -граматикою.
Алгоритм пошуку
Алгоритм [обчислення , ]: будемо розглядати всілякі дерева, які можна побудувати, починаючи з аксіоми :
-
. Очевидно, за 0 кроків ми виведемо , після якої знаходиться . У інших випадках — невизначено, .
-
. В інших випадках — невизначено.
-
. В інших випадках — невизначено.
Настане крок , коли , .
Тоді покладемо , .
Очевидно, що:
-
послідовність монотонно зростаюча;
-
— послідовність обмежена зверху.
Разом ці умови гарантують збіжність послідовності , а отже і алгоритму пошуку .
-нетермінали
Нетермінал КС-граматики називається -нетерміналом, якщо .
Алгоритм [пошуку -нетерміналів]:
-
.
-
.
-
.
-
.
Тоді множина — множина -нетерміналів.
Приклад. Для граматики з схемою правил знайдемо множину -нетерміналів:
Таким чином, множина -нетерміналів для наведеної вище граматики — .
Ліва рекурсія
До того, як перевірити граматику на -властивість необхідно перевірити її на наявність ліворекурсивних нетерміналів та спробувати уникнути лівої рекурсії.
Алгоритм [тестування нетермінала на ліву рекурсію]: для кожного нетермінала побудуємо наступну послідовність множин :
-
, починаємо з нетерміналу .
-
.
-
.
-
.
Тоді якщо , то — ліворекурсивний нетермінал.
Приклад. Для граматики зі схемою правил знайдемо множину ліворекурсивних нетерміналів:
Виконаємо процедуру тестування для кожного нетермінала окремо, наприклад, для нетермінала :
Запропонуємо декілька прийомів, що дають можливість при побудові -граматик уникнути лівої рекурсії. Розглянемо граматику зі схемою правил , яка має ліворекурсивний нетермінал . Замінимо схему правил новою схемою з трьома правилами , .
Приклад: для граматики з схемою правил для кожного нетермінала знайдемо множину :
З прикладу, що наведено раніше множини , будуть такими:
Таким чином, , , , , .
Контрольні запитання
-
Яка граматика називається -граматика?
-
Чи кожна КС-граматика є -граматикою для деякого ?
-
Яка -граматика називається розподіленою?
-
Яку бінарну операцію над мовами позначає символ ?
-
Яку мову (множину слів) позначає запис ?
-
Опишіть алгоритм пошуку і доведіть його збіжність.
-
Яка -граматика називається сильною?
-
Чи кожна -граматика є сильною -граматикою?
-
Яку мову (множину слів) позначає запис ?
-
Опишіть алгоритм пошуку і доведіть його збіжність.
-
Який нетермінал називається -нетерміналом?
-
Опишіть алгоритм перевірки нетерміналу на -нетермінал і доведіть його збіжність.
-
Який нетермінал називається ліворекурсивним?
-
Опишіть алгоритм перевірки нетерміналу на ліву рекурсію і доведіть його збіжність.
(традиційні відповіді можна переглянути у коментарях у вихідному коді цієї сторінки)