Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СИСТЕМНЕ ПРОГРАМУВАННЯ ТА ОС.doc
Скачиваний:
9
Добавлен:
28.10.2018
Размер:
503.3 Кб
Скачать
  1. Представлення синтаксичної структури формальної мови. Форма Бекуса-Наура.

Форма́льна мо́ва — множина скінчених послідовностей символів, які описуються правилами певного виду, які називаються граматикою, або синтаксисом мови (див.формальна граматика).

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

Формальні мови можна класифікувати за характером формального апарату, що застосовується для їхнього описання:

Нота́ція Бе́куса—Нау́ра (англ. Backus-Naur formBNF) є спосіб запису правил контекстно-вільної граматики, себто формою опису формальної мови.

Саме її типово використовують для запису правил мов програмування та протоколів комунікації. У 50-х роках минулого сторіччя Джон Бекус створив цю нотацію розробляючи мову ALGOL. На першому Всесвітньому Комп'ютерному Конгресі, що відбувся у Парижі 1959-го він зробив доповідь на тему "Синтаксис та семантика пропонованої першої міжнародної алгебраїчної мови". Пізніше Наур Пітер спростив її та (за порадою Дональда Кнута) додав до назви своє ім'я.

Запис

Нотація БНФ є набором «продукцій», кожна з яких відповідає зразку:

<символ> ::= <вираз, що містить символи>

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

Далі,

  • < — лівий обмежувач виразу

  • > — правий обмежувач виразу

  • ::= — визначене як

  • | — або

Ці чотири символи є символами мета-мови, вони не визначені у мові, котру описують. Решта описаних символів належать до «абетки» описуваної мови.

Для прикладу подивимось на можливу нотацію BNF для поштової адреси:

<поштова-адреса> ::= <поштове-відділення> <вулична-адреса> <особа>

<поштове-відділення> ::= <індекс> "," <місце> <EOL>

<місце> ::= <село> | <місто>

<вулична-адреса> ::= <вулиця> "," <будинок> <EOL>

<особа> ::= <прізвище> <ім’я> <EOL> | <прізвище> <ім’я> <по-батькові> <EOL>

  1. Представлення проміжного коду. Елементарні операції, польський запис.

Генерація проміжного коду. Відбувається перетворення вихідної програми в проміжну (наприклад, польську) форму запису.  Оптимізація проміжного коду - виділення загальних подвираженія та обчислення константних подвираженія.  Фаза оптимізації призначена для зменшення надлишковості програми за витратами часу та пам'яті. У залежності від критеріїв проектування транслятора дана фаза обробки програми може виключатися з циклу обробки програми.

Формування проміжного коду

Можливі різні форми внутрішнього подання синтаксичних конструкцій вихідної програми в компіляторі. Дерево граматичного розбору виявляється незручним у роботі при роботі при генерації й оптимізації об'єктного коду. Тому перед оптимізацією і безпосередньо генерацією об'єктного коду внутрішнє представлення програми перетвориться в одну з відповідних форм запису.  Прикладами таких форм запису є:  - Зворотна польський запис операцій;  - Тетради операцій;  - Тріади операцій;  - Власне команди асемблера.  Зворотний польський запис - це постфіксній запис операцій. Перевагою її є те, що всі операції записуються безпосередньо в порядку їх виконання. Вона надзвичайно ефективна в тих випадках, коли для обчислень використовується стек.  Тетради представляють собою запис операцій у формі з чотирьох складових:  <Операція> (<операнд1>, <операнд2>, <результат>).  Тетради використовуються рідко, так як вимагають більше пам'яті для свого представлення, ніж тріади, не відображають взаємозв'язку операцій і, крім того, погано відображаються в команди асемблера і машинні коди, тому що в наборах команд більшості сучасних машин не зустрічаються операції з трьома операндами.  Тріади представляють собою запис операцій у формі з трьох складових: <операція> (<операнд1>, <операнд2>), при цьому один або обидва операнди можуть бути посиланнями на іншу тріаду в тому випадку, якщо в якості операнда даної тріади виступає результат виконання іншою тріади. Тому тріади при записі послідовно номеруют для зручності вказівки посилань одних тріад на інші. Наприклад, вираз A: = B * C + D - B * 10, записане у вигляді тріад будемати вигляд:  1) * (B, C)  2) + (^ 1, D)  3) * (B, 10)  4) - (^ 2, ^ 3)  5): = (A, ^ 4)  Тут операції позначені відповідним знаком (при цьому присвоєння також є операцією), а знак ^ означає посилання операнда однієї тріади на результат інший.  Команди асемблера зручні тим, що при їх використанні внутрішнє представлення програми повністю відповідає об'єктного коду і складні перетворення не потрібні. Проте використання команд асемблера вимагає додаткових структур для відображення їх взаємозв'язку. Крім того, внутрішнє представлення програми виходить залежним від результуючого коду, а це значить, що при орієнтації компілятора на інший результуючий код потрібно перебудовувати як саме внутрішнє представлення програми, так і методи його обробки в алгоритмах оптимізації (при використанні тріад або тетрад цього не потрібно) .  Для побудови внутрішнього подання об'єктного коду (надалі - просто коду) по дереву висновку може використовуватися найпростіша рекурсивна процедура. Ця процедура перш за все повинна визначити тип вузла дерева - він відповідає типу операції, символ якої знаходиться в листі дерева для поточного вузла. Цей лист є середнім листом вузла дерева для бінарних операцій і крайнім лівим листом - для унарних операцій. Після визначення типу процедура будує код для вузла дерева відповідно до типу операції. Якщо всі вузли наступного рівня для поточного вузла є листя дерева, то в код включаються операнди, що відповідають цим листю, і код, стає результатом виконання процедури. Інакше процедура повинна рекурсивно викликати сама себе для генерації коду нижележащих вузлів дерева і результат виконання включити в свій породжений код.  Тому для побудови внутрішнього подання об'єктного коду по дереву виведення в першу чергу необхідно розробити форми подання об'єктного коду для чотирьох випадків, відповідних видів поточного вузла дерева виведення:  обидва нижележащих вузла дерева - листя (термінальні символи граматики);  тільки лівий нижележащий вузол є листом дерева;  тільки правий нижележащий вузол є листом дерева:  обидва нижележащих вузла не є листям дерева.

структурна схема компілятора.