Page 32 - 4761
P. 32
3.2 Визначення границь лексеми
Визначення границь лексеми – це виділення тих рядків в загальному потоці
вхідних символів, для яких треба виконати розпізнавання.
Наприклад, мова FORTRAN: (в ній ігноруються), оператору DO 10 I=1 –
неможливо визначити тип оператора мови, а коли DO 10 I=1,15 – це цикл з перечисленням
від 1 до 15 цілої змінної І до мітки 10.
Розглянемо оператор мови С: К=i+++++j <=> K=(i++)+(++j). Знайти цю
конструкцію лексичний аналізатор може тільки переглянувши її до кінця і перебравши всі
варіанти, причому невірні варіанти можуть бути визначені тільки на етапі семантичного
аналізу (наприклад, К=(і++)+++j) є синтаксично вірним але семантикою мови С не
допускається.
Отже, знайти границі лексеми лексичний аналізатор може тільки перебравши всі
варіанти, причому невірні варіанти можуть бути знайдені тільки на етапі семантичного
аналізу.
Тому в більшості випадків компіляторів лексичний і синтаксичний аналізатори – це
взаємозв’язані частини. Є два принципово різних метода організації цього взаємозв’язку:
- послідовний
- паралельний.
При послідовному варіанті лексичний аналізатор переглядає весь текст вхідної
програми від початку до кінця і перетворює його в таблицю лексем. Таблиця лексем
заповнюється зразу повністю, компілятор використовує її для наступних фаз компіляції,
але в подальшому не змінює. Подальшу обробку таблиці лексем виконують наступні фази
компіляції. Якщо в процесі розбору лексичний аналізатор не зміг правильно визначити
тип лексеми, то вважається, що вхідна програма має error.
При другому варіанті лексичний аналіз тексту вхідної програми виконується
поетапно, по кроках. Лексичний аналізатор виділяє чергову лексему в вхідному коді і
передає її синтаксичному аналізатору. Він, виконавши розбір чергової конструкції мови,
може підтвердити правильність знайденої лексеми і звернутися до лексичного аналізатора
за наступною або відкинути знайдену. В другому випадку він може проінформувати
лексичний аналізатор про те, що потрібно вернутися назад до вже переглянутого раніше
фрагменту вхідного коду і повідомити йому додаткову інформацію про те, якого типу
лексему слідує чекати. Взаємодіючи між собою таким чином, лексичний і синтаксичний
аналізатори можуть перебрати декілька можливих варіантів лексем, і якщо ні один з них
не підійде, буде рахуватись що вхідна програма має помилку. Тільки після того, як
синтаксичний аналізатор успішно виконає розбір чергової конструкції вхідної мови,
лексичний аналізатор поміщає знайдені лексеми в таблиці лексем і в таблицю
ідентифікаторів і продовжує розбір в тому ж порядку.
Робота синтаксичного і лексичного аналізаторів при їх паралельній взаємодії
показана рисунку 3.1.
Рисунок 3.1 – Паралельна взаємодія лексичного і синтаксичного аналізів
30