На головну

 КАЗАНЬ 2008 |  Вхідна мова С0 |  Використання компілятора С0 |  Мова асемблера IBM PC |  Об'єктний код компілятора C0 |  завдання |  Трансляція фрагмента програми |  Порядок виконання роботи |  Розширення можливостей транслятора С0 |  Приклад розширення мови і транслятора C0 |

Загальні відомості про компіляторі С0

  1.  I. Загальні положення
  2.  I. Загальні положення З ВИВЧЕННЯ ДИСЦИПЛІНИ
  3.  I. Загальні рекомендації
  4.  I. Загальні вимоги охорони праці
  5.  II. Які загальні фактори впливають на постановку мети виховання?
  6.  II. Загальні початку застосування покарання
  7.  II. Загальні вимоги ДО ВИКОНАННЯ РОЗРАХУНКОВО-ГРАФІЧНОЇ РОБОТИ

Компілятор С0 переводить вихідну програму з мови С0 на мову асемблера IBM PC. Вибір мови асемблера в якості об'єктного мови дозволив максимально спростити компілятор, зробити його однопрохідним і зрозумілішим, уникнувши численних технічних деталей генерації машинного коду. Компілятор вийшов простим і доступним для огляду (всього лише близько 700 рядків на мові C). У той же час, незважаючи на граничну простоту, мова C0 виявився придатним навіть для практичних завдань.

Компілятор написаний на мові C і складається з 18 підпрограм (функцій), які використовують близько 30 глобальних змінних.

Таблиця імен. Основний глобальної структурою даних компілятора СО є таблиця імен транслюється програми, кожен елемент якої складається з трьох полів: ім'я, вид так званої об'єкта (змінна / функція) і зміщення в кадрі стека (для локальних змінних і параметрів). Таблиця має дворівневу структуру (глобальні імена і локальні імена поточної транслюється функції) і являє собою стек у вигляді масиву tabim з чотирьох частин, межі індексів Рис. 1. Структура таблиці імен

яких глобальними змінними: kolglb - кількість глобальних імен; kolim - загальна кількість імен і kpar - кількість імен після включення параметрів (див. рис. 1).

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

Пошук і організувати імена в таблицю виконують підпрограми pozic і vkluсh.

Синтаксичний і семантичний аналіз.Трансляція виразів в С0 проводиться методом стека з пріоритетами. Решта конструкції мови (оператори та опису) транслюються методом рекурсивного спуску [1, 2, 6]. Будь-яким з цих методів можна було б транслювати всю програму.

Конструкцію "програма" мови С0 аналізує головна програма компілятора main, "опис (визначення) функції" - підпрограма oprfun, "опис змінних" - opisper, "оператор" - operatr, "вираз" - virag.

Послідовність операторів виду "[оператор] . . .} ", Яка трапляється в описі функції і складеному операторі, аналізується підпрограмою poslop. синтаксичні програми main, opisper, poslop, operatr, virag є в той же час і семантичними програмами, Т. К. Генерують об'єктний код для своїх конструкцій.

Підпрограма operatr відповідає рекурсивному правилом граматики С0 для конструкції "оператор" (всередині оператора може знаходитися інший оператор) і тому сама є рекурсивної. Це забезпечує трансляцію багаторівневих вкладень складових і умовних операторів і циклів.

Структура синтаксичної програми (крім virag) практично однозначно визначається структурою відповідного правила граматики.

Лексичний аналіз в трансляторі С0.Програма сhleks читає чергову лексему вхідного тексту і привласнює її значення глобальної змінної leksema, використовуючи для читання чергового символу підпрограму chsim.

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

Діагностика та нейтралізація помилок.Діагностика та нейтралізація помилок потрібно не тільки транслятора, а й будь-якій програмі. При виявленні помилки необхідно повідомити про неї. Подальші дії програми можуть бути різними.

Найпростіше - припинити роботу, але це не завжди прийнятно. По можливості бажано продовжити роботу, хоча б для виявлення інших помилок. Тоді необхідно якось нейтралізувати ( "виправити") помилку, виходячи з найбільш імовірного припущення про характер помилки.

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

У компіляторі С0 підпрограма oshibka (n) вставляє в вихідний файл повідомлення про помилку типу n у вигляді рядка з символом "^", розташованим в позиції поточного символу вхідного рядка, і значенням n.



 Приклад звіту з лабораторної роботи 1 |  Трансляція виразів в компіляторі С0
© um.co.ua - учбові матеріали та реферати