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

Етапи семантичного аналізу.

Семантичний аналізатор виконує такі основні дії:

· Перевірка дотримання у вхідний програмі семантичних угод вхідної мови;

· Доповнення внутрішнього представлення програми на компіляторі операторами і діями, неявно передбаченими семантикою вхідної мови;

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

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

Прикладами таких угоді є такі вимоги:

· Кожна мітка, на яку є посилання, повинна один раз бути присутнім у програмі;

· Кожен ідентифікатор повинен бути описаний один раз, і жоден ідентифікатор не може бути описаний більше одного разу (з урахуванням блокової структури описів); · Всі операнди у виразах і операціях повинні мати типи, допустимі для даного виразу або операцій;

· Типи змінних у виразах повинні бути узгоджені між собою;

· При виклику процедур і функцій число і типи фактичних параметрів повинні бути узгоджені з числом і типами формальних параметрів.

Наприклад, якщо оператор мови Pascal має вигляд

a: = b + c:

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

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

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

Якщо повернутися до розглянутого вище елементарного оператору мови Pascal:

a: = b + c:

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

Однак не все так очевидно просто, припустимо, що десь перед розглянутим оператором ми маємо опис його операндів у вигляді:

Var а: real;

b: integer;

c: double;

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

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

З урахуванням запропонованих типів даних, у розглянутому приклад будуть не дві, а чотири операції: перетворення цілочисельний змінної b у формат дійсних чисел з подвійною точністю; складання двох дійсних чисел подвійною точністю; перетворення результату в дійсне число з одинарною точністю; присвоєння результату змінної c. Кількість операцій зросла вдвічі, причому додалися нетривіальні функції перетворення типів. Перетворення типів - его тільки один варіант операцій, неявно додаються компілятором в код програми на основі семантичних угоді. Іншим прикладом такого роду операцій можуть служити операції обчислення адреси, коли відбувається звертання до елементів складних структур даних. Існують й інші варіанти такого роду операцій.

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

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

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