Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

spz / lect / NE_3_2_KA

.pdf
Скачиваний:
15
Добавлен:
23.02.2016
Размер:
361.93 Кб
Скачать

Кінцеві автомати

Нехай X - кінцевий алфавіт (тобто кінцева множина символів). Детермінованим кінцевим автоматом (ДКА) називається орієнтований граф, у якого ребра позначені елементами алфавіту X, причому

рівно одна вершина графа позначена як початкова;

деякі вершини позначені як кінцеві, множина кінцевих вершин непорожня (вершина може бути одночасно й початковою, і кінцевою);

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

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

Вершини графа кінцевого автомата іноді називають станами, ребра - переходами.

Можна трохи послабити вимоги до графа кінцевого автомата. А саме,

може бути більше однієї початкової вершини;

у графі можуть бути ребра, позначені порожнім ланцюжком;

з однієї вершини можуть виходити кілька ребер, позначених однією й тією ж буквою або порожнім ланцюжком.

Утакий спосіб ми одержимо визначення недетермінованого кінцевого автомата. (Природно, клас недетермінованих КА містить у собі клас детермінованих КА.)

Мова, що задається недетермінованим КА, визначається так само, як і у випадку детермінованого КА.

Приклади

1. Детермимнированный КА a

1 - -> 2

^\

| b

a \ V 3

у якого вершина 1 - початкова, вершина 3 -і кінцева, задає мову ab(aab)* (зірочка означає повторення будь-яка кількість разів, включаючи нуль).

2. Недетермінований КА

+-і+

 

 

 

 

 

|

| b

 

 

a

 

 

V

|

/

\

> /

\

/--

+\ a

------

| 1 | -----> | 2 | ------

b

> | 3 |

\--

+/

\---

/

\---

/

^

|

 

 

 

 

 

|

| a

 

 

 

 

 

+--

+

 

 

 

 

 

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

Дуже легко перевірити чи належить довільний ланцюжок мові, заданій детермінованим КА. Нехай спочатку автомат перебуває в початковому стані. Будемо подавати послідовно символи ланцюжка на вхід автомату. Якщо з поточної вершини є перехід по черговому символі (тобто є ребро, що виходить із цієї вершини, позначене даною буквою), то переводимо автомат у стан, у яке йде відповідне ребро. Якщо такого ребра немає, то ланцюжок не належить мові. Якщо по останньому символі ланцюжка автомат переходить у деякий кінцевий стан, то ланцюжок належить мові. Таким чином, належність ланцюжка мові перевіряється за час, що лінійно залежить від довжини ланцюжка (тобто максимально швидко).

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

Автомати: модель кінцевого автомата

Кінцевим автоматом (КА) називається формальна система виду:

M(Q,V, ,q0,F), де -

Q - кінцева множина станів автомата;

V - кінцева множина вхідних символів (алфавіт);

- функція переходів, що відображає декартовий добуток множин V x Q у множину підмножин Q

q0 – початковий стан автомата Q, q0 Q;

F - непуста множина кінцевих станів автомата F Q.

Модель КА представляє кінцеве керування, що читає символи по одному з лінійної вхідної стрічки послідовно зліва направо. Множина станів Q складається зі станів кінцевого керування.

0

1

 

0

 

1

1

 

1

1

 

0

1

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Кінцеве

керування

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

Робота КА являє собою послідовність кроків (тактів). На кожному кроці роботи автомат перебуває в одному зі своїх поточних станів Q, на наступному кроці він може перейти в інший стан або залишитися в поточному. Те, у який стан автомат перейде на наступному кроці роботи, визначає функція переходів . Ця функція залежить не тільки від поточного стану, але й від символу з алфавіту V, поданого на вхід автомата.

КА називають повністю визначеним, якщо в кожному його стані існує функція переходу для всіх можливих символів, тобто a V, q Q (a,q) = R, R Q.

Робота КА триває доти, поки на його вхід надходить символи їхнього вхідного ланцюжка V+ (V+ - множина всіх ланцюжків над алфавітом V без порожнього ланцюжка).

Конфігурацію КА на кожному кроці роботи можна визначити у вигляді (q, ,n), де q – поточний стан автомата, q Q; - ланцюжок вхідних символів,V+, n – положення покажчика в ланцюжку символів, n N {0}, n | | (N – множина натуральних чисел). Початкова конфігурація автомата (q0, ,0); заключна конфігурація автомата (f, ,n), f Q, n=| |, якщо f F.

КА M(Q,V, ,q0,F) приймає ланцюжок символів V+, якщо, одержавши на вхід цей ланцюжок, він з початкового стану q0 може перейти в один з кінцевих станів f F. У противному випадку КА не приймає ланцюжок символів.

Мова L(M), заданий КА M(Q,V, ,q0,F), - це множина всіх ланцюжків символів, які приймаються цим автоматом. Два КА еквівалентні, якщо вони задають ту саму мову.

Розрізняю детерміновані й недетерміновані автомати. КА M(Q,V, ,q0,F) називають детермінованим кінцевим автоматом (ДКА), якщо в кожному з його станів для будь-якого вхідного символу функція переходу містить не більше одного стану: a V, q Q: або (a,q)={r}, r Q, або (a,q)= . У

противному випадку КА називають недетермінованим.

Якщо функція переходів ДКА визначена для кожного стану автомата, то автомат називається повністю визначеним ДКА: a V, q Q: либо

(a,q)=r, r Q.

Для будь-якого КА можна побудувати еквівалентний йому ДКА. При побудові компіляторів найчастіше використають повністю визначений ДКА, тому що моделювати його роботу істотно простіше, ніж довільного КА.

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

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

Кінцеві автомати не можуть розпізнавати всі мови, породжувані граматиками, мови розпізнавані ними - мови 3-го типу - регулярні мови.

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

Розпізнавачі й перетворювачі

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

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

Загалом, виді умовна схема роботи алгоритму розпізнавача (у комп'ютері такої схеми немає!):

Вхідний ланцюжок символів

 

 

 

a1

a2

 

 

an

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Зчитуюча

 

 

 

 

 

 

Робоча пам'ять

 

 

головка

 

УУ(зовнішня)

Розпізнавач, що є частиною компілятора, являє собою частину ПЗ комп'ютера.

Компоненти:

-стрічка, що містить вхідний ланцюжок символів, і голівка, що зчитує черговий символ у цьому ланцюжку;

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

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

Розпізнавач працює із символами свого алфавіту - алфавіту розпізнавача. Алфавіт розпізнавача кінцевий. Він містить у собі всі припустимі символи вхідних ланцюжків, а також деякий додатковий алфавіт символів, які можуть оброблятися УУ й зберігатися в робочій пам'яті розпізнавача.

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

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

-зміст вхідного ланцюжка символів і положення голівки, що зчитує, у ній;

-стан УУ;

-уміст зовнішньої пам'яті.

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

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

Мова, обумовлена розпізнавачем, - множина всіх ланцюжків, які допускає розпізнавач.

Розпізнавачи класифікують залежно від виду складових їхніх компонентів і по типах мов.

По компонентах:

1.По видах пристрою, що зчитує

a)Однобічні розпізнавачі

Допускають переміщення голівки, що зчитує, по стрічці вхідних символів тільки в одному напрямку.

b) Двосторонні розпізнавачі

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

2. По видах пристрою керування: a) Детерміновані

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

b) Недетерміновані

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

3. По видах зовнішньої пам'яті:

a)Розпізнавачі без зовнішньої пам'яті

Упроцесі роботи використається тільки кінцева пам'ять пристрою керування, без доступу до зовнішньої пам'яті.

b)Розпізнавачі з обмежено зовнішньою пам'яттю

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

c) Розпізнавачи з необмеженою зовнішньою пам'яттю Припускають, що для їхньої роботи може знадобитися зовнішня

пам'ять необмеженого об'єму (поза залежністю від довжини вхідного ланцюжка). У таких розпізнавачів передбачається пам'ять із довільним методом доступу.

Ці три складові дозволяють організувати загальну класифікацію розпізнавачів. Наприклад, можливий такий тип: «двосторонній недетермінований розпізнавач із лінійно обмеженою зовнішньою пам'яттю».

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

По типах мов:

1. Для мов із фразовою структурою Мова із фразовою структурою - самий складний. Всі природні мови

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

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

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

3. Для контекстно-вільних мов КВ-мови лежать в основі синтаксичних конструкцій більшості

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

довжини цього ланцюжка. Також серед КВ-мов існує багато класів мови, для яких ця залежність квадратична або лінійна.

Оскільки швидкість роботи автомата має істотне значення, для аналізу текстів на різних мовах програмування застосовуються контекстно-вільні перетворювачі.

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

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

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

4. Для регулярних мов Регулярні мови - найпростіший тип мов. Вони є найпоширенішим і

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

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

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

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

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

Аналізатори контекстно-вільних мов

Тому що будь-яка регулярна граматика є КВ-граматикой (але не навпаки). А синтаксичні конструкції мов програмування, як правило, можуть бути описані за допомогою КВ-граматик. У застосуванні КВ-граматик діють лексичні й синтаксичні аналізатори.

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

Лексема (лексична одиниця мови) - структурна одиниця мови, що складається з елементарних символів мови й не містить у своєму складі інших структурних одиниць мови. Лексеми природних мов - слова.

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

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

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

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

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

відразу, і більше до неї компілятор не вертається. Всю подальшу обробку виконують подальші фази компіляції.

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

Лексичний аналізатор реалізується на основі кінцевих автоматів. Кінцевий автомат для кожного вхідного ланцюжка мови відповідає на запитання про приналежності ланцюжка мові, заданому автоматом. Також, сканер повинен чітко визначити границі лексеми, які у вихідному тексті явно не задані. І виконати дії для збереження інформації про виявлену лексему.

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

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

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

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

Основу будь-якого синтаксичного аналізатора завжди становить розпізнавач, побудований на основі якого-небудь класу КВ-граматик. Автоматизована побудова синтаксичних аналізаторів може бути виконана за

допомогою програми YACC (історично корінь - також UNIX). Аналізована мова описується у вигляді, близькому формі Бэкуса-Наура. Результат роботи YACC є вихідний текст синтаксичного розпізнавача мовою C.

Література

1.Мартыненко Б.К. Мови й трансляції - Спб.: С.-Петербурзький університет, 2001.

2.Гордєєв А.В., Молчанов А.Ю. Системне програмне забезпечення - Спб.:

Питер, 2001.

Соседние файлы в папке lect