knu/csc/appl-math/c3s2/sys-prog

синтез і аналіз мовних процесорів

Зміст:

Проблеми загальних граматик

При виведенні слова в на кожному кроці безпосереднього виведення, коли ми беремо до уваги виділений нами нетермінал (в залежності від стратегії виведення), виникає питання, яку альтернативу для використати. З точки зору практики, нас цікавить така стратегія виведення в граматиці , коли кожний наступний крок безпосереднього виведення наближав би нас до мети. Ця стратегія дасть можливість виконати виведення в за час , де .

Зрозуміло, що не маючи інформації про структуру , досягнути вибраної нами мети в більшості випадків неможливо. Але ж тримати інформацію про все слово також недопустимо. З точки зору практики, отримати потрібний результат розумно при наявності локальної інформації, наприклад, поточних вхідних лексем програми ( — наперед фіксоване число) достатньо для організації виведення в за час . З точки зору синтаксичного аналізу слова мова ведеться про наступну ситуацію:

img-15

Зафіксуємо стратегію виведення: далі будемо розглядати лише лівосторонню стратегію виведення в . Тоді:

Сформульовані умови забезпечує клас -граматик.

-граматики

КС-граматика називається -граматикою для деякого фіксованого , якщо для двох лівосторонніх виведень вигляду:

  1. ;

  2. ;

з випливає, що , де , а

Неформально, граматика буде -граматикою, якщо для слова достатньо перших символів (за умови, що вони існують) решти непроаналізованого слова щоб визначити, що з існує не більше однієї альтернативи виведення слова, що починається з та продовжується наступними термінальними символами.

Сформулюємо основні твердження стосовно класу -граматик:

  1. Не існує алгоритма, який перевіряє належність КС-граматики класу -граматик.

  2. Для кожного конкретного існує алгоритм, який перевіряє, чи є задана граматика -граматикою.

  3. Якщо граматика є -граматикою, то вона є -граматикою, .

  4. Клас -граматик — це підклас КС-граматик, який не покриває його.

Продемонструємо на прикладі справедливість останнього твердження. Розглянемо граматику з наступною схемою : .

Мова, яку породжує наведена вище граматика . Візьмемо виведення наступного слова . За визначенням -граматики якщо покласти то маємо отримати

Втім, для маємо:

Таким чином, КС-граматика не може бути -граматикою для жодного .

Як наслідок, КС-граматика , яка має ліворекурсивний нетермінал (нетермінал називається ліворекурсивним, якщо в граматиці існує вивід виду ), не може бути -граматикою.

З практичної точки зору в більшості випадків ми будемо користуватися -граматиками. У класі -граматик існує один цікавий підклас — це розподілені -граматики.

-граматика називаються розподіленою, якщо вона задовольняє наступним умовам:

Зауважимо, що , де — бінарна операція над словарними множинами (мовами) визначена наступним чином:

Звідси маємо наступний тривіальний висновок: якщо , де , то

Для подальшого аналізу визначення -граматики розглянемо алгоритм обчислення функції , .

Алгоритм пошуку

Очевидно, що якщо , то при . Розглянемо алгоритм пошуку , .

Алгоритм [пошуку , ]: визначимо значення функції для кожного :

  1. для всіх , .

  2. .

  3. .

  4. для всіх .

Очевидно, що:

Тоді покладемо для кожного .

Приклад: знайти множину для нетерміналів граматики з наступною схемою правил:

Нехай , тоді маємо наступну таблицю:

 

Скористаємося визначенням сформулюємо необхідні й достатні умови, за яких КС-граматика буде -граматикою: для довільного виводу в граматиці вигляду та правила :

Вище сформульована умова для -граматик може бути перефразована з урахуванням визначення множини : для довільного виведення в граматиці вигляду та правила :

Оскільки , то остання умова є конструктивною умовою і може бути використана для перевірки, чи КС-граматика є -граматикою для фіксованого .

Сильні -граматики

КС-граматика називається сильною -граматикою, якщо для кожного правила вигляду виконується умова:

де , визначається так:

Неформально, відмінність сильних -граматик від звичайних -граматик полягає у тому, що наступне правило безпосереднього виведення, яке буде застосовано до можна визначити абстраговано від уже виведеної частини слова , розглядаючи тільки наступні символів які потрібно отримати після .

Операції та можна узагальнити для словарної множини , тоді:

Без доведення зафіксуємо наступні твердження:

Не всі граматики сильні

На прикладі продемонструємо останнє твердження. Нехай граматика визначена наступними правилами: , .

Відповідні множини , , , .

Перевіримо умову для сильної -граматики:

  1. виконаємо перевірку -умови для правила :

  2. виконаємо перевірку -умови для правила :

Висновок: вище наведена граматика не є сильною -граматикою. Перевіримо цю ж граматику на властивість -граматики. Тут ми маємо два різні варіанти виводу з :

  1. : .

  2. : .

Висновок: наведена вище граматика є -граматикою.

Алгоритм пошуку

Алгоритм [обчислення , ]: будемо розглядати всілякі дерева, які можна побудувати, починаючи з аксіоми :

  1. . Очевидно, за 0 кроків ми виведемо , після якої знаходиться . У інших випадках — невизначено, .

  2. . В інших випадках — невизначено.

  3. . В інших випадках — невизначено.

Настане крок , коли , .

Тоді покладемо , .

Очевидно, що:

Разом ці умови гарантують збіжність послідовності , а отже і алгоритму пошуку .

-нетермінали

Нетермінал КС-граматики називається -нетерміналом, якщо .

Алгоритм [пошуку -нетерміналів]:

  1. .

  2. .

  3. .

  4. .

Тоді множина — множина -нетерміналів.

Приклад. Для граматики з схемою правил знайдемо множину -нетерміналів:

Таким чином, множина -нетерміналів для наведеної вище граматики — .

Ліва рекурсія

До того, як перевірити граматику на -властивість необхідно перевірити її на наявність ліворекурсивних нетерміналів та спробувати уникнути лівої рекурсії.

Алгоритм [тестування нетермінала на ліву рекурсію]: для кожного нетермінала побудуємо наступну послідовність множин :

  1. , починаємо з нетерміналу .

  2. .

  3. .

  4. .

Тоді якщо , то — ліворекурсивний нетермінал.

Приклад. Для граматики зі схемою правил знайдемо множину ліворекурсивних нетерміналів:

Виконаємо процедуру тестування для кожного нетермінала окремо, наприклад, для нетермінала :

Запропонуємо декілька прийомів, що дають можливість при побудові -граматик уникнути лівої рекурсії. Розглянемо граматику зі схемою правил , яка має ліворекурсивний нетермінал . Замінимо схему правил новою схемою з трьома правилами , .

Приклад: для граматики з схемою правил для кожного нетермінала знайдемо множину :

З прикладу, що наведено раніше множини , будуть такими:

 

Таким чином, , , , , .

Контрольні запитання

  1. Яка граматика називається -граматика?

  2. Чи кожна КС-граматика є -граматикою для деякого ?

  3. Яка -граматика називається розподіленою?

  4. Яку бінарну операцію над мовами позначає символ ?

  5. Яку мову (множину слів) позначає запис ?

  6. Опишіть алгоритм пошуку і доведіть його збіжність.

  7. Яка -граматика називається сильною?

  8. Чи кожна -граматика є сильною -граматикою?

  9. Яку мову (множину слів) позначає запис ?

  10. Опишіть алгоритм пошуку і доведіть його збіжність.

  11. Який нетермінал називається -нетерміналом?

  12. Опишіть алгоритм перевірки нетерміналу на -нетермінал і доведіть його збіжність.

  13. Який нетермінал називається ліворекурсивним?

  14. Опишіть алгоритм перевірки нетерміналу на ліву рекурсію і доведіть його збіжність.

(традиційні відповіді можна переглянути у коментарях у вихідному коді цієї сторінки)

Назад до лекцій

Назад на головну