У нас: 141825 рефератів
Щойно додані Реферати Тор 100
Скористайтеся пошуком, наприклад Реферат        Грубий пошук Точний пошук
Вхід в абонемент





з предмету «Основи побудови трансляторів».



Створення найпростішого компілятора.


Зміст.
Вступ.
1.Управління таблицею символів.
2.Аналіз і синтез.
3.Символи,шаблони,лексеми.
Висновок.
Список використаної літератури.



Вступ.
Компілятор- це програма, що перекладає з мови високого рівня на машинну мову. Прикладів можна навести багато: C, C++, Pascal, Ada, Fortran, Algol... Можна розширити це поняття, включивши сюди будь-які програми, що перекладають з однієї мови на іншу, наприклад, програми, що транслюють Паскаль у C. Проте більшість з них виконує дії, що є загальними для багатьох компіляторів, і тому будується на тих самих базових принципах.

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

Рисунок 2.1- Фази компілятора

На практиці, деякі фази транслятора можуть бути згруповані разом, проміжні фази всередині представлення програми можуть не створюватися.

Крім того, неформально, диспетчер таблиці символів та обробник помилок можуть вважатися фазами компілятора.

1.Управління таблицею символів.

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

var position, initial, rate : real

коли лексичний аналізатор знайде ці символи, то їх тим ще є невідомим.

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

2.Аналіз і синтез.

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

Є кілька причин для поділу стадії аналізу компіляції на лексичний аналіз і синтаксичний аналіз:

1. Такий поділ часто дозволяє спростити одну з цих стадій. Якщо розробляється нова мова, то поділ лексичних (мовних) і синтаксичних (правил правопису) приводить до більш зрозумілої структури мови в цілому.

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

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

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

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

1. Структурні редактори. На відміну від звичайних текстових редакторів, ці редактори орієнтовані на конкретний тип документів. Наприклад, є текстові редактори, які при введенні програм на C чи C++ самі робить потрібні відступи в вкладених блоках, виділяють різним кольором елементи програми, можуть перевіряти відповідність дужок та ін.

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

3. Інтерпретатори. Вони відрізняються від компіляторів тим, що не видають цільовий код, а виконують проаналізовані команди. Такі мови, як Smalltalk чи Lisp, є інтерпретованими. Деякі мови компілюються не в машинний код, а в спеціалізований код, що потім інтерпретується; у якості прикладу можна назвати Java чи ранні версії Clipper'a. До інтерпретаторів відносяться командні оболонки операційних систем, наприклад, COMMAND.COM. Інтерпретатором певною мірою є і процесор ЕОМ.

4. Утиліти для обробки текстів. Наприклад, програма grep шукає в тексті фрагменти, що можуть мати досить складну структуру, а програма awk виконує складні перетворення текстових файлів.

5. Програми форматування текстів. Як приклад можна назвати систему підготовки наукових текстів TeX. При наборі в текст вставляються спеціальні команди форматування; компілятор TeX видає опис документа у двійковому форматі, що потім інтерпретується програмами перегляду і друку. Сюди ж можна віднести програми, що працюють з такими форматами, як RTF чи HTML, а також препроцесори текстів програм.

6. Засоби для розробки компіляторів. Такі програми приймають на вході опис мови і генерують програму-аналізатор.

7. "Силіконові компілятори". Сучасні інтегральні схеми настільки складні і містять так багато логічних елементів, що їх уже давно ніхто не проектує вручну від початку до кінця. Замість цього логіка схеми описується на спеціалізованій мові високого рівня; спеціальні автомати за цим описом виготовляють матриці для схем.

Лексичний аналіз є першою фазою компіляції. Його основна задача - читання вхідних символів і формування послідовності термінальних символів мови для синтаксичного аналізатора. Іноді лексичний аналізатор розділяють на дві фази: сканування і власне лексичний аналіз.

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

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

- значення лексеми, що визначає підрядок символів вхідного ланцюжка, що відповідають розпізнаному класу лексеми. У залежності від класу, значення лексеми


Сторінки: 1 2