
- •Анотація
- •1. Огляд методів та способів проектування трансляторів
- •1.1. Введення в трансляцію
- •1.2. Структура транслятора
- •1.3. Проходи транслятора
- •1.4. Засоби побудови трансляторів
- •2. Формальний опис вхідної мови програмування
- •2.1 Деталізований опис вхідної мови в термінах ebnf
- •2.2 Опис термінальних символів та ключових слів
- •3. Розробка транслятора вхідної мови
- •3.1 Вибір технології програмування
- •3.2 Проектування таблиць транслятора та вибір структур даних
- •3.3 Розробка лексичного аналізатора
- •Розробка граф-схеми алгоритму
- •Опис програми реалізації лексичного аналізатора
- •3.4 Розробка синтаксичного та семантичного аналізатора
- •Розробка граф-схеми алгоритму
- •Опис програми реалізації синтаксичного та семантичного аналізатора
- •3.5 Розробка генератора коду
- •Розробка граф-схеми алгоритму
- •Опис програми реалізації генератора коду
- •Повне дерево граматичного розбору
- •Результат роботи генератора коду:
- •4. Опис інтерфейсу та інструкції користувача
- •5. Відлагодження та тестування програми
- •5. 1. Виявлення лексичних помилок
- •Виявлення синтаксичних помилок
- •Для початку протестуємо наступний код в якому навмисно допущено різноманітні помилки. Як видно з (рис. 5.2) транслятор коректно виявляє різноманітні синтаксичні помилки.
- •Виявлення семантичних помилок
- •5.2. Загальна перевірка коректності роботи транслятора
- •Висновки
- •Список літератури
- •Додаток а: Завдання на курсову роботу
- •Додаток б: Загальний алгоритм роботи транслятора
- •Додаток в. Текст коректної програми на мові z30
Повне дерево граматичного розбору
Результат роботи генератора коду:
.586
.model flat, C ,stdcall
option casemap: none
include c:\masm32\include\msvcrt.inc
includelib c:\masm32\lib\msvcrt.lib
include c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\kernel32.lib
.data
. . .
.code
start:
mainmodule proc
. . .
mainmodule endp
Plus proc
. . .
Plus endp
Minus proc
. . .
Minus endp
Mult proc
. . .
Mult endp
Divd proc
. . .
Divd endp
ModOp proc
. . .
ModOp endp
EQUALOP proc
. . .
EQUALOP endp
NOTEQUALOP proc
. . .
NOTEQUALOP endp
GREATEROP proc
. . .
GREATEROP endp
LESSOP proc
. . .
LESSOP endp
NOTOP proc
. . .
NOTOP endp
OROP proc
. . .
OROP endp
ANDOP proc
. . .
ANDOP endp
ASSOP proc
. . .
ASSOP endp
Read proc
. . .
Read endp
PushVar proc
. . .
PushVar endp
IsInit proc
. . .
IsInit endp
PushNum proc
. . .
PushNum endp
NotInitErr proc
. . .
NotInitErr endp
DivBy0Err proc
. . .
DivBy0Err endp
OverFlowErr proc
. . .
OverFlowErr endp
InputErr proc
. . .
InputErr endp
ErrorEnd proc
. . .
ErrorEnd endp
end start
4. Опис інтерфейсу та інструкції користувача
Програма транслятор має простий інтерфейс SDI. Стандартне меню з командами збереження (Ctrl+S), відкриття (Ctrl+O), створення нового файлу (Ctrl+N). Також тут є меню з командами виконання всіх фаз трансляції і компіляції(F5). Меню довідки містить команду показу вікна з інформацією про програму. Головна робоча область складається з поля введення тексту і поля зі списком помилок.
Рис. 4.1 Середовище розробки мови Z30.
Рис. 4.2 Користувацькі меню середовища розробки.
5. Відлагодження та тестування програми
Відлагодження програми відбувається в покроковому режимі в середовищі Microsoft Visual Studio 2010 з використанням точок зупинки, що дає можливість знайти місце логічної помилки. В покроковому режимі у нас є можливість прослідкувати за значеннями змінних.
Тестування програми буде відбуватися з допомогою готових прикладів на вхідній мові в яких можуть використовуватися різноманітні оператори вхідної мови, можуть бути допущені різноманітні лексичні, граматичні та синтаксичні помилки.
5. 1. Виявлення лексичних помилок
На етапі лексичного аналізу виникають наступні помилки: Нерозпізнана лексема – це помилка яка може виникнути на етапі лексичного аналізу, коли лексема відповідає регулярному виразу лексичної помилки. Завеликий числовий літерал – це помилка яка може виникнути на етапі лексичного аналізу, коли числовий літерал є завеликим для типу Integer_4. Коли виникає будь-яка помилка, то вона записується в глобальний список помилок.
Виявлені лексичні помилки можуть підсвічуватися в редакторі після виконання лексичного аналізу (рис. 6).
startprogram
startblock
variable n >> 0 integer_4;
write "n = ";
read n;
dfhfhf;
if n !> 0
startblock
write "n is positive";
endblock
else
startblock
write "n is negative";
endblock
endblock
Рис. 5.1 Виявлення лексичних помилок.