Семантичний аналіз і синтез об'єктної програми
Семантичний аналіз є найменш формалізованою частиною процесу трансляції, оскільки стосується «змісту» тих конструкцій мови, які аналізуються на етапах лексичного і синтаксичного аналізу. Формально процес семантичного аналізу і синтезу об'єктної програми реалізує перетворення дерева виводу програми у текст еквівалентної форми. Це перетворення і складність його програмної реалізації суттєво залежать від вибору об'єктної мови. При цьому зазвичай синтаксичний аналіз чергується з семантичним. Спочатку синтаксичний аналізатор ідентифікує послідовність лексем, формуючи синтаксичну одиницю − вираз, оператор, виклик програми тощо, а потім розпізнана синтаксична одиниця (структура) розпізнається семантичним аналізатором.
Семантичний аналізатор поділяється на ряд дрібніших семантичних аналізаторів − семантичних підпрограм, кожна з яких призначена для обробки одного конкретного типу програмної конструкції. Наприклад, описи масивів можуть оброблятись одним аналізатором, арифметичні вирази − другим, оператор умовного переходу − третім і т.д.
Для простих трансляцій результатом роботи семантичного аналізатора може бути і об'єктна програма, але зазвичай виходом семантичного аналізатора є деяка внутрішня форма трансльованої програми − проміжна програма. При цьому часто проміжна програма породжується частинами і тому може бути дуже неефективною і вимагати оптимізації перед генерацією об'єктної програми.
Семантичний аналіз дуже залежить від мови програмування, тому підходи і способи побудови семантичного аналізатора можуть суттєво відрізнятись для різних мов програмування. Але практично для всіх мов програмування під час семантичного аналізу у першу чергу потрібно виконати семантичний контроль, тобто перевірку семантичних (контекстних) умов у програмі або семантичних угод . Ці умови мають загальний характер і не залежать від змісту конкретної задачі.
Опишемо деякі типові контексні умови.
Умова єдиності опису ідентифікаторів, що іменують прості змінні, масиви, процедури, мітки. Крім того, формальний параметр процедури або функції не повинен входити більше одного разу у список формальних параметрів.
Умови відповідності між входженнями ідентифікаторів при їх означенні та використанні. Входження-означення ідентифікатора є у конструкції, яка описує цей ідентифікатор. Наприклад, ідентифікатор мітки поміченого оператора − це входження-означення, а ідентифікатор мітки у операторі goto − це входження-використання. Ідентифікатори змінних, які входять у оператор присвоєння або в деякий вираз (наприклад, в умовному операторі), − це також входження-використання. Умова відповідності виконується, якщо для входження-використання деякого ідентифікатора знайдено відповідне входження-означення. Алгоритм пошуку входжень-означень називається алгоритмом ідентифікації. Для програм з блочною структурою дія алгоритму ідентифікації полягає у пошуку відповідного входження-означення у мінімальному блоці, що містить входження-використання. Якщо воно не знайдено, відбувається пошук у мінімальному блоці, який охоплює вже розглянутий блок і т.д. Якщо у програмі не знайдено входження-означення, та у мові не використовується правило означення ідентифікаторів за замовчуванням, то дана контекстна умова вважається невиконаною.
Контексні умови для формальних параметрів процедур визначаються у такий спосіб: ідентифікатор описується або у блоці, де є тіло процедури, або у мінімальному блоці, що містить опис процедури, або може входити у список формальних параметрів.
Алгоритми ідентифікації, крім перевірки умов відповідності, здійснюють збір інформації про об'єкти програми. Ця інформація пізніше використовується для правильної побудови фрагментів об'єктної програми з урахуванням контекстних умов.
Умова відповідності типів значень. Ці умови регламентують відповідність видів величин, що входять у відповідні конструкції програми. Наприклад, операндами в арифметичних виразах, можуть бути тільки числові константи, ідентифікатори арифметичних змінних, імена арифметичних функцій; не можна змішувати різні арифметичні типи значень тощо. Для виклику процедур і функцій перевіряється відповідність значень фактичних і формальних параметрів та їх кількість.
Відзначимо важливість контекстних умов відповідності типів значень. Наприклад, у мовах Паскаль, Сі існують різні способи конструювання нових типів з елементарних. Тому перевірку відповідності типів значень у таких мовах виконувати складніше.
4. Умови, що задають кількісні обмеження. Ці умови пов'язані з обмеженнями, що накладаються конкретною розробкою транслятора для вхідної мови (наприклад, обмежуються глибина вкладеності блоків, вимірність використаних масивів тощо).