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

Призначення семантичного аналізу.

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

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

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

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

Таким чином, вхідними даними для семантичного аналізу служать:

· Таблиця ідентифікаторів;

· Результати розбору синтаксичних конструкцій вхідної мови.

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

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

У кожному компіляторі зазвичай присутні обидва варіанти семантичного аналізатора.

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