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

Курсовой проект - Компьютеры, программирование

Другие курсовые по предмету Компьютеры, программирование

ься конкретний набір процедур. Для реалізації обчислень арифметичних виразів використовується переведення їх у постфіксну форму, після чого такий вираз обчислюється з використанням математичного співпроцесора. Для переведення виразу у постфіксну форму використовується структура даних стек. Стек реалізований на масиві. В даному випадку використано стандартний набір функцій: Init (створення нового стеку), Empty (перевірка чи стек порожній), Full (перевірка чи стек повний), Push (заштовхування елементу у вершину стеку), Pop (вилучення елементу із вершини стеку). Ввід та вивід реалізовано за допомогою 21го переривання, функції 02h для посимвольного виводу тa 0Аh для вводу в буфер з подальшим розпізнаванням. Цикл реалізовано за допомогою команди далекого переходу (far ptr). Логічні операції виконуються над аргументами побітово, з використанням асемблерних команд AND, OR, NOT.

 

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

 

Для реалізації лексичного аналізу створюємо таблицю, в яку поміщаємо всі зарезервовані слова (char table[31] [10]), в курсовій роботі їх використовується 31е, і таблицю (char name[20] [7]) для ідентифікаторів, які будуть введені користувачем. Імя програми в цю таблицю не заноситься. Для реалізації таблиці лексем описана така структура:

struct Ltable

{

int num;

char slovo[30];

int klas;

char atribute;

int code;

};

 

Поле num призначене для зберігання рядка, в якому знаходиться лексема;

Поле slovo призначене для зберігання самої лексеми;

Поле klas призначене для зберігання класу до якого належить лексема;

Поле atribute призначене для зберігання атрибуту лексеми і для ідентифікаторів цілого типу, b для логічних ідентифікаторів та 0 для всіх решта;

Поле code призначене для зберігання коду лексеми.

Сама таблиця лексем є масивом таких структур.

Лексеми мають такі класи:

Клас лексем блоку 1

клас операторів вводу виводу 2

клас операторів присвоєння 3

клас математичних операторів 4

клас операторів порівняння 5

клас логічних операторів 6

клас ідентифікаторів 7

клас операторів циклу 8

клас лексем оголошення 9

клас лексем опису і аргументів виводу 10

клас синтаксичних лексем 11

клас констант 12

Відомості про класи з таблиці лексем використовуються при синтаксичному аналізі. Інформація з поля atribute використовується при семантичному аналізі.

Ключові слова мають такі коди:

Program0

Var1

Start2

Finish3

Input4

Output5

For6

DownTo7

+8

9

Mul10

Div11

Mod12

:=13

==14

!=15

Le16

Ge17

!!18

&&19

||20

(21

)22

;23

24

<<25

>>26

Integer27

Bool28

Усі ідентифікатори та цифрові константи отримують код 30. Коди використовуються генератором коду для формування відповідних процедур мовою асемблер.

Для реалізації стеку використано таку структуру:

struct stacktype

{char data[20] [10];

int prior[20];

int kod[20];

int top;

};

 

Поле data використовується для зберігання символу операції;

Поле prior використовується для зберігання пріоритету операції;

Поле kod використовується для зберігання коду операції;

Поле top вказує на вершину стеку.

Для запамятовування виразу в постфікс ній формі використовується така структура:

struct Form

{

char post[25] [10];

int cod[25];

};

 

Поле post призначене для зберігання ідентифікаторів, констант і символів операцій;

Поле cod призначене для зберігання коду лексеми, що міститься у відповідному полі post.

 

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

 

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

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

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

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

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

На фазі лексичного аналізу м?/p>