- •2 Лексичний аналіз
- •2.1. Роль лексичних аналізаторів
- •2.1.1 Завдання лексичного аналізу
- •2.1.2 Токени, шаблони, лексеми
- •2.1.3 Атрибути токенів
- •2.2. Алфавит, рядки і мови
- •2.2.1 Алфавит та рядки над алфавитом
- •2.2.2 Рядки й мови
- •2.2.3 Операції над мовами
- •2.3 Регулярні вирази
- •2.2.4 Регулярні визначення
- •2.2.5 Скорочення
- •2.2.6 Нерегулярні множини
- •2.4. Розпізнавання токенів
- •Id → letter (letter | digit)*
- •2.3.1 Діаграми переходів
- •2.3.2 Реалізація діаграми переходів
2.2. Алфавит, рядки і мови
2.2.1 Алфавит та рядки над алфавитом
Алфавитом V називають кінцеву непусту множину символів. Приклади: {0,1}, {a,b,c,d}. В наведених прикладах символ коми використовується як роздільник між символами. Таким чином, термін алфавит, або клас символів, позначає будь-яку кінцеву множину символів. Типовим прикладом символів можуть служити букви або алфавитно-цифрові символи. Множина {0,1} являє собою бінарний алфавит.
Конкатенацією двох символів”a” і ”b” називають операцію, наслідком якої є послідовність символів ”ab”. Це визначення розповсюджується і для послідовностей символів. Якщо позначимо операцію конкатенації символом ”+”, а отримання результату символом “→”, то : ”a”+”b” → ”ab”; ”ab”+”b2” → ”abb2”. По-іншому, якщо х и y — рядки, то конкатенація рядків х и y, що записується як ху, є рядком, сформованим шляхом дописування y до х. Наприклад, якщо x = dog, а y = house, то ху= doghouse.
Рядок над алфавитом V визначається як символ із алфавиту V або послідовність символів, яка отримана в результаті конкатенації символів або послідовності символів із алфавиту V. Таким чином, рядок над деяким алфавитом — це кінцева послідовність символів, узятих з алфавиту. У теорії мов термін речення (sentence) і слово (word) часто використаються як синоніми терміна "рядок". Довжина рядка s, звичайно позначувана як |s|, дорівнює кількості символів у рядку. Наприклад, довжина рядка banana дорівнює шести. Порожній рядок, позначуваний як ε (також, як і нульовий символ), являє собою спеціальний рядок нульової довжини або як рядок, що складається тільки з нульового символа ε.
Приклад. Хай задано алфавит V={1,2,3}. Тоді послідовності символів ”2”, ”31” та ”12331” є рядками над алфавитом V, а послідовності символів ”a”, ”341” та ”1b301” не є рядками над алфавитом V.
Хоча з функціональної і програмістської точек зору між рядками и числами є суттєва різниця, але з точки зору математики у них є певні загальні властивості.
Нехай для дійсних змінних x та y задана операція додавання „+”. Які властивості притаманні операції „+”?
а) замикання х+у – теж дійсне число. Ту ж саму властивість має операція конкатенація над рядками: в результаті операції над рядками “а”+”b”→”аb” отримуємо також рядок;
б) асоціативність: (x+y)+z = x+(y+z)=x+y+z. Для операції конкатенації над рядками теж саме (“а”+”b”)+”c”= “а”+(”b”+”c”)=“а”+”b”+”c”=”аbc”;
в) існування нульового (порожнього) елементу, тобто існує елемент і, такий що х+і=х. Для чисел це 0. Для рядків – пустий рядок, який будемо позначати символом ε (існують ще й інші позначення нейтрального елемента, наприклад, “λ”, “Ω”).
Хай V2 = V+V – множина всіх рядків довжиною 2, отриманих над V;
V3 = V2 + V – множина всіх рядків довжиною 3, отриманих над V;
Vn= Vn-1 + V – множина всіх рядків довжиною n, отриманих над V;
тоді:
Транзитивне замикання алфавиту V визначається як V+ = V ᴜ V2 ᴜ V3 ᴜ…
ᴜ Vn-1 ᴜ Vn ᴜ…
а
Рефлексивне замикання алфавиту V визначається як V* = ε ᴜ V ᴜ V2 ᴜ… = ε ᴜ V+
Деякі загальновживані терміни, що пов'язані із частинами рядків, наведені на рис. 2.3.
Термін |
Визначення |
|
|
Префікс рядка s (prefix) |
Рядок, отриманий видаленням нуля або декількох останніх символів рядка s; наприклад, ban є префіксом рядка banana |
|
|
Суфікс рядка s (suffix) |
Рядок, отриманий видаленням нуля або декількох перших символів рядка s; наприклад, nаnа є суфіксом рядка banana |
|
|
Підрядок рядка s (substring) |
Рядок, отриманий видаленням префікса й суфікса рядка s; наприклад, nan є підрядком рядка banana. Кожен префікс і кожен суфікс також є підрядками, але не кожен підрядок є префіксом або суфіксом. Для кожного рядка s рядки s і ε є суфіксами, префіксами й підрядками рядка s. |
|
|
Правильні префікс, суфікс і підрядок рядка s |
Будь-який непустий рядок х, що є відповідно префіксом, суфіксом і підрядком рядка s і не збігається з рядком s |
|
|
Підпослідовність рядка s (subsequence) |
Будь-який рядок, сформований видаленням нуля або декількох (не обов'язково послідовних) символів з рядка s. Так, bааа є підпослідовністю рядка banana |
||
Рис. 2.3. Терміни, що описують частини рядків
