Смекни!
smekni.com

Розробка системних програмних модулів систем програмування (стр. 1 из 4)

Анотація

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

Транслятор був розроблений за допомогою технології C# в середовищі MS Visual Studio 2010.

Зміст

Анотація……………………………………………………………………………………2

Зміст………………………………………………………………………………………3

Завдання на курсову роботу……………………………………………………………..4

Вступ………………………………………………………………………………………5

1. Огляд методів та способів проектування трансляторів………………………….7

2. Формальний опис вхідної мови програмування………………………………….8

2.1. Деталізований опис вхідної мови в термінах розширеної нотації

Бекуса-Наура…………………………………………………………………………………….8

2.2. Опис термінальних символів та ключових слів……………………………………..10

3. Розробка транслятора вхідної мови програмування……………………………12

3.1. Вибір технології програмування………………………………………………………12

3.2. Проектування таблиць транслятора та вибір структур даних………………13

3.3. Розробка лексичного аналізатора……………………………………………………16

3.3.1. Розробка граф-схеми алгоритму…………………………………………17

3.3.2. Опис програми реалізації лексичного аналізатора…………………..17

3.4. Розробка синтаксичного та семантичного аналізатора……………………….19

3.4.1. Розробка дерев граматичного розбору…………………………………20

3.4.2. Розробка граф-схеми алгоритму…………………………………………21

3.4.3. Опис програми реалізації синтаксичного та

семантичного аналізатора…………………………………………………………………..22

3.5. Розробка генератора коду…………………………………………………………….23

3.5.1. Розробка граф-схеми алгоритму…………………………………………23

3.5.2. Опис програми реалізації генератора коду…………………………….24

4. Опис інтерфейсу та інструкції користувача……………………………………..25

5. Відлагодження та тестування програми…………………………………………27

5.1. Виявлення лексичних помилок………………………………………………………….27

5.2. Виявлення синтаксичних помилок…………………………………………………….28

5.3. Виявлення семантичних помилок……………………………………………………..29

5.4. Загальна перевірка коректності роботи транслятора…………………………30

Висновки…………………………………………………………………………………31

Список літератури……………………………………………………………………..32

Додатки………………………………………………………………………………….33

А. Лістинг програм……………………………………………………………………………33


Завдання на курсову роботу

Тема: Розробка транслятора з вхідної мови програмування.

- типи даних: INT32_t, BOOLEAN, const string;

- оператор вводу: READ;

- оператор виводу: WRITE;

- блок тіла програми: START, FINISH

- оператор: WHILE DO (Паскаль);

- регістр ключових слів: Up;

- регістр ідентифікаторів: Low2 ;

- операції арифметичні: ADD, SUB, MUL, DIV,MOD;

- операції порівняння: =, <>, LE, GE

- операції логічні: !, &, |;

- коментар: $$...

- ідентифікатори змінних, числові константи, рядкові константи;

- оператор присвоєння: >>;

Для отримання виконавчого файлу з вихідного асемблерного коду потрібно використовувати ml.ex (MASM32) вбудований в MS Visual Studio 2010.


Вступ

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

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

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

Транслятори поділяються на:

- Адресний.

- Діалоговий.

- Багатопрохідної.

- Зворотний. (детранслятор).

- Однопрохідної.

- Оптимізуючий.

- Синтаксично-орієнтований (синтаксично-керований).

- Тестовий.

Мова процесорів (машинний код) зазвичай є низькорівневою. Існують платформи, які використовують в якості машинної мову високого рівня (наприклад, iAPX-432), але вони є винятком із правила через складність і високу вартість. Транслятор, який перетворює програми в машинну мову, який приймає і виконуваний безпосередньо процесором, називається компілятором.

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


1. Огляд методів та способів проектування трансляторів

Є такі методи створення компіляторів:

1. Прямий метод- цільовою мовою і мовою реалізації є асемблер.

2. Метод розкрути- саме цей метод і використовується у даній курсовій роботі, тобто вибирається інструмент (в даній курсовій це мова асемблер), для якого вже існує компілятор.

3.Використання крос-трансляторів.

4.З використанням віртуальних машин–дає спосіб отримати переносимо програму.

5. Компіляція на ходу.

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

Для кожного нетермінального символу K будується функція, яка для будь-якого вхідного слова x робить дві речі:

· Знаходить найбільший початок z слова x, здатний бути початком виводжуваного з K слова

· Визначає, чи є початок z виводжуваним з K

Така функція має задовольняти наступні критерії:

· зчитувати із ще необробленого вхідного потоку максимальний початок A, який є початком деякого слова, виводжуваного з K

· визначати чи є A вивідним з K або просто невивідним початком виводжуваного з K слова

У випадку, якщо такий початок зчитати не вдається (і коректність функції для нетермінала K доведена), тоді вхідні дані не відповідають мові, і потрібно зупинити розбір.Розбір містить у собі виклики описаних вище функцій. Якщо для зчитаного нетермінала є складене правило, тоді при його розборі будуть викликані інші функції для розбору терміналів, що входять в нього. Дерево викликів, починаючи із самої«верхньої» функції еквівалентно дереву розбору.

Низхідний метод аналізу реалізується на основі контекстно-вільних граматик.

Контекстно-вільна граматика G це четвірка (N,T,P,S):

·

· N та T скінченні множини, що не перетинаються

· P скінченна підмножина

При цьому, використовують наступні назви: N — множина нетермінальних символів, T — множина термінальних символів, P — множина правил виводу S початковий символ. Правила (α,β)єP записують як α→β.

В лівій частині правила виводу має знаходитись одна змінна (нетермінальний символ). Формально, має виконуватись

, wobei
.

LL аналізатор це алгоритм синтаксичного аналізу методом рекурсивного спуску для підмножини контекстно-вільних граматик. Він обробляє вхід зліва направо (тому перша буква означає Left), та будує ліворекурсивне виведення рядка (тому його порівнюють з LR аналізатором ). Клас граматик, що розпізнаються цим аналізатором називається LL граматиками.

Далі описується табличний аналізатор — альтернатива алгоритму рекурсивного спуску, який зазвичай кодується вручну (хоча не завжди, дивіться наприклад ANTLR для генератора аналізаторів LL(*) граматик методом рекурсивного спуску).

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

LL аналізатор називається LL(*) аналізатором, якщо він не обмежений скінченним числом токенів для попереднього перегляду, а може приймати рішення визначаючи чи належать вхідні токени регулярній мові (наприклад використовуючи ДСкА).