Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
main_ta.doc
Скачиваний:
19
Добавлен:
16.09.2019
Размер:
2.29 Mб
Скачать

3.8. Розв'язати системи рівнянь з регулярними коефіцієнтами.

              1. Чи є мова {0+4п | т,п > 0} регулярною? Відповідь обґрун­туйте.

              2. Нехай Ь - мова над алфавітом {0}. Довести, що мова Ь* є регулярною. [Підказка: доведіть і використайте той факт, що якщо а та Ь є взаємно простими натуральними числами, то для кожного натурального п > аЬ існують такі невід'ємні цілі числа и та V, що виконується рівність п = иа + VЬ.]

Лекція 4. Формальні породжувальні грамати-

ки

Ми визначили формальну мову Ь як множину слів скінченної довжини в алфавіті X. Відразу виникає важливе питання: як опи­сати мову Ь в тому випадку, коли вона нескінченна. Зрозуміло, що якщо Ь складається зі скінченної кількості слів, то найбільш очеви­дний спісіб - скласти перелік всіх слів мови Ь. Однак для багатьох мов не можна (або, можливо, не бажано) обмежувати верхню грань довжини найдовшого слова мови. Отже, доводиться розглядати мо­ви, які містять як завгодно багато слів. Очевидно, що такі формальні мови неможливо визначити вичерпним переліком слів, які їм нале­жать, і, отже, потрібно шукати інші способи їх описання. Як і раніше, ми хочемо, щоб опис мови був скінченним, хоча сама мова може бути й нескінченною. Відомо декілька методів опису мов, які задоволь­няють цій вимозі. Один з них полягає в використанні системи, яка називається граматикою. Слова формальної мови будуються точно визначеними способами з застосуваннями правил граматики. Одною з переваг визначення мови з допомогою граматики є та, що операції,

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

Формальною породжувальною граматикою називається четвірка виду О = (Ж, Т, 5, Р), де N - скінченна непорожня множина, елемен­ти якої будемо називати нетермінальними символами, Т - скінченна непорожня множина, елементи якої будемо називати термінальни­ми символами, 5 Є N - початковий нетермінальний символ, Р - скінченна множина продукцій (правил перетворення) вигляду £ ^ п, де £ та п - слова в алфавіті N У Т. Букви термінального алфаві­ту позначатимемо малими латинськими буквами чи цифрами, а не- термінального алфавіту - великими латинськими буквами. Слова в алфавіті N У Т, як завжди, будемо позначати малими грецькими бу­квами. Нагадаємо, що множину всіх слів в алфавіті А позначають через А* .

Нас цікавитимуть слова, які можуть бути породжені продукція- ми граматики. Нехай О = (^ Т, 5, Р) - граматика, і нехай а0 = а£т (тобто ао - конкатенація слів а, £ і т), а1 = апт - слова в алфа­віті N У Т. Якщо £ ^ п - продукція граматики О, то говорять, що а1 безпосередньо виводиться з а0, і записують а0 ^ а1. Якщо а0, а1,..., ап - слова в алфавіті N У Т такі, що а0 ^ а1 ^ а2 ^ ... ^ ап-1 ^ ап, то говорять, що ап виводиться з а0 і записують а0 ап.

Мовою, що породжується граматикою О = (^ Т, 5, Р), нази­вають множину всіх слів терміналів, які виводяться з початкового символу 5. її позначають £(О). Таким чином,

£(О) = {^ Є Т* | 5

4.1. Приклад. Граматика О, яка породжує речення (слово з чоти­рьох букв формальної мови £(О)) "хороший студент одержав п'ятір­ку" матиме вигляд О = (^ Т, 5, Р), де

М={<речення>, <група підмета>, <група присудка>, <означе­ння>, <підмет>, <присудок>, <додаток>};

Т={ хороший, студент, одержав, п'ятірку }; 8=< речення >.

Множина продукцій Р містить продукції: <речення> ^ <група підмета> <група присудка>, <група підмета> ^ <означення> <підмет>,

<група присудка> ^ <присудок> <додаток>,

<означення> ^ хороший,

<підмет> ^ студент,

<присудок> ^ одержав,

<додаток> ^ п'ятірку.

Єдиним виведенням даної граматики з початковго нетерміналь- ного символу є шукане речення:

<речення> ^ <група підмета> <група присудка> ^ <означен­ня> <підмет> <група присудка> ^ <означення> <підмет> <при­судок> <додаток> ^ хороший <підмет> <присудок> <додаток> ^ хороший студент <присудок> <додаток> ^ хороший сту­дент одержав <додаток> ^ хороший студент одержав п'ятір­ку.

Таким чином, £(О) складається з єдиного слова, яке містить чо­тири букви (термінали).

£(О) = {"хороший студент одержав п'ятірку"}.

  1. Приклад. Нехай О - граматика з нетермінальним алфавітом N = {8, А}, множиною терміналів Т = {а, 6}, початковим символом 8 і множиною продукцій Р = {8 ^ 6А, 5 ^ а, А ^ 66}. Знайдемо мову £(О), що породжується цією граматикою.

Із початкового символу 8 можна вивести слово 6А за допомогою продукції 8 ^ 6А чи застосувати продукцію 8 ^ а, щоб вивести а. З 6А, скориставшись продукцією А ^ 66, можна вивести слово 666. Ніяких інших слів вивести неможливо. Отже, £(О) = {а, 666}.

  1. Приклад. Розглянемо граматику О = ^ = {8}, Т = {0,1}, 8, Р : {8 ^ е, 8 ^ 081}) і знайдемо мову, що породжується нею.

Граматика О містить єдиний нетермінальний символ і єдине пра­вило 8 ^ 081, права частина якого містить цей символ. Таким чи­ном, єдиними виведеннями граматики О є виведення форми

8 ^ 081 ^ 00811 ^ ... ^ 0п81п ^ 0пе1п = 0п 1п

Отже,

£(О) = {0п 1п | п > 0}.

Якщо ми маємо багато правил граматики з однаковими лівими частинами

А ^ х1, А ^ х2,... А ^ хт,

то ми можемо об'єднати їх в одне правило наступного вигляду

А > Х1 | Х2 |... | хт.

Наприклад, правила з попереднього прикладу можуть бути записані як 5 ^ е | 051.

4.4. Приклад. Розглянемо граматику С = (Ж = {5, А, В},Т = {а, Ь}, 5, Р), де множина продукцій Р містить наступні правила:

5 ^ АВА, А ^ а | ЬЬ, В ^ Ь5 | е

і знайдемо мову Ь(С).

Оскільки нетермінальний символ А може тільки продукувати термінальні символи, то ми можемо відкласти його заміщення на- останок. Таким чином, виведення граматики С мають наступну за­гальну форму:

5 ^ АВА ^ АЬ5А ^ АЬАВАА ^ АЬАЬ5АА ^ А(ЬА)2 В А3 ^ ... ^ А(ЬА)пВАп+1 ^ А(ЬА)пАп+1.

Насамкінець, замінюємо нетермінал А терміналами а та ЬЬ, і одержуємо слова вигляду

+ ЬЬ)(Ьа + ЬЬЬ)п + ЬЬ)п+1. Таким чином, Ь(С) складається з усіх таких слів, де п > 0.

Граматики класифікують за типами продукцій. Розглянемо кла­сифікацію, яку запропонував американський математик і лінгвіст Н. Хомскі. Принцип цієї класифікації полягає в тому, що на продукції накладено певні обмеження. Він поділив граматики на чотири типи.

У граматиці типу 0 немає жодних обмежень на продукції. Гра­матика типу 1 може мати продукції лише у вигляді £ ^ п, де дов­жина слова п не менша, ніж довжина слова £, або у вигляді £ ^ е. У граматиці типу 2 можуть бути лише продукції А ^ ш, де А - нетер- мінальний символ, ш Є (Ж Ц Т)*. Граматика типу 3 може мати такі продукції: А ^ шВ, А ^ ш і А ^ е, де А, В - нетермінали, ш - слово з терміналів. Із цих означень випливає, що кожна граматика типу п, де п = 1, 2,3, є граматикою типу п1. Граматики типу 2 називають кон­текстно вільними, бо нетермінал А в лівій частині продукції А ^ п можна замінити словом п в довільному оточенні щоразу, коли він зустрічається, тобто незалежно від контексту. Мову, яку породжує граматика типу 2, називають контекстно вільною. Якщо в множині продукцій Р є продукція виду ^ , < |п|, то граматику

а

а

а

а

а) (б)

В загальному випадку для контекстно вільної граматики О = (Ж, Т, 8, Р) дерево виведення будується наступним чином:

  1. Вершиною дерева є початковий нетермінальний символ 8.

  2. Повторюємо наступні кроки доти, доки кожен листок дере­ва буде або порожнім символом е або термінальним символом: для кожного листка А Є N дерева обираємо продукцію А ^ х\х2 .. .хп граматики О, де Хі Є N ЦІ Т і замінюємо вершину А Є N наступним деревом:

п

А

хп — 1

Якщо конкатенація листків дерева виведення є словом ш Є Т*, то кажемо, що дане дерево є деревом виведення для слова ш.

Дерево виведення слова ш відповідає виведенню ш в граматиці О. Легко бачити, що часто дерево виведення відповідає більш ніж одному виведенню слова ш. Наприклад, для граматики О, визначеної вище, є 16 різних виведень слова ш = аЬаса в граматиці О. Серед них 8 виведень, які починаються з 8 ^ 8Ь8, зображуються одним і ти же деревом виведення, показаним на рисунку (а). Решту 8 виведень, що починаються з 8 ^ 8с8, зображені деревом виведення на рисунку (б).

Щоб зробити відповідність між деревами виведення і виведен­нями в граматиці О взаємно однозначною, назвемо виведення слова ш Є £(О) лівим виведенням, якщо завжди застосовується відповід­на продукція граматики О для заміни найлівішого нетермінального символу в проміжному слові при виведенні слова ш. Очевидно, що кожне дерево виведення слова ш відповідає єдиному лівому виведен­ню слова ш. Наприклад, серед восьми виведень для ш = а6аса, які починаються з 5 ^ 565 єдиним лівим виведенням є

5 ^ 565 ^ а65 ^ а65с5 ^ а6ас5 ^ а6аса.

Контекстно вільна граматика О = (^ Т, 5, Р) називається не­однозначною, якщо існує слово ш Є £(О), яке має два або більше різних дерев виведень. Якщо граматика використовується для визна­чення мови програмування, то бажано, щоб вона була однозначною. В іншому випадку програміст і компілятор можуть по різному зро­зуміти смисл деяких програм.

  1. Приклад. Найбільш відомим прикладом неоднозначності в мо­вах програмування є, очевидно, "плаваюче"еізе.

Розглянемо граматику О з правилами

5 ^ іґ 6 іЬеп 5 еІ8в 5 | іґ 6 іЬеп 5 | а. Ця граматика неоднозначна, оскільки слово

іґ 6 іЬеп іґ 6 іЬеп а еІзе а

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]