Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Самарасінгхе_кр.docx
Скачиваний:
7
Добавлен:
15.02.2015
Размер:
212.76 Кб
Скачать

2 Використання кінцевих автоматів

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

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

2.1 Розпізнавання регулярних виразів

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

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

Задача синтезу скінченного автомата полягає в створенні такого автомата акцептора, який би розпізнавав дану регулярну мову.

2.1.1 Мови й регулярні вирази

З погляду завдання мови важливу роль разом із граматиками, що породжують, грають регулярні вирази (regular expression). Визначення регулярного виразу співзвучно з арифметичними, логічними виразами. Дійсно, всі ці вирази будуються за строгими правилами своєї аксіоматики. Так, над арифметичними виразами існує прийнята аксіоматика алгебри, у якій введені пріоритети виконання арифметичних операцій і спосіб їхнього перевизначення за допомогою круглих дужок. Операнди в арифметичних виразах мають властивості комутативності, асоціативності й ін.

Точно так само для регулярних виразів нижче будуть уведені певні аксіоми, наслідком яких будуть еквівалентні перетворення цих виразів.

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

Регулярні вирази є більш компактним способом визначення підкласу (підмножини) мов, аніж потужний апарат породжуючих граматик. Словник операцій регулярних виразів обмежений операціями конкатенації, «або» (|) і замикання Кліні (означає ітерацію над буквою й цифрою або замикання Кліні).

Як предметне позначення деякого об'єкта з мови, приведемо приклад ідентифікатора, що представляє певним чином побудований ланцюжок символів – букв (Б) або цифр (Ц), причому першим символом у ланцюжку є буква, а потім послідовність букв і цифр. граматики, що породжують, у цьому випадку визначають цю конструкцію як

G [<ідентифікатор>]:

VT = {Б, Ц}, VN = {<ідентифікатор>, <хвіст ідентифікатора>, <Б Ц>}

P:

1. < ідентифікатор >→ Б < хвіст ідентифікатора >

2. < хвіст ідентифікатора >→<Б Ц>< хвіст ідентифікатора > | L

<БЦ>→Б | Ц

Мова, породжувана цією граматикою L (G[<ідентифікатор >]) і є

ідентифікатором. Ця ж мова ідентифікаторів можна задати простіше у вигляді простої формули 14

R1 = Б (Б | Ц)*,

(14)

відповідно мова, визначена формулою або регулярним виразом R1 визначена як множина L(R1) = {Б (Б|Ц)*}.

Таке просте завдання мови не вимагає компонентів VN, P, Z й у загальному самої граматики G[Z]. Необхідно тільки задати словник S =VT і саме вирази (формулу) R, що визначає мова.

Так само просто можна визначити цілі без знака, як нескінченну ітерацію цифр позиційної системи числення R2 = a b*, де a – це всі цифри без 0 – [1 – 9], b – всі цифри – [0 – 9].

Відповідно мова цілих представлена дуже просто – L(R2) = {ab*}.

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

Регулярні вирази широко використаються у всіх процесорах, у яких потрібен шаблоновий-орієнтований пошук. У першу чергу – це лексичні аналізатори. Для виділення шаблонів – ідентифікаторів, числових констант, ключових слів і т.д. використають регулярні вирази. Наприклад, у системі LEX генератора лексичних аналізаторів всі шаблони визначаються регулярними виразами, а генератор в LEX генерує ефективний скінченний автомат, що розпізнає шаблони.