Вивчення складових частин, основних принципів побудови і функціонування компіляторів. Поняття хешування, сутність алгоритму роботи лексичного аналізатора. Практичне освоєння методів побудови простих компіляторів для заданої вхідної мови - Borland Delphi.
Аннотация к работе
КУРСОВА РОБОТА з дисципліни: “Системне програмне забезпечення” На тему: “Створення компілятора” ЗМІСТ Вступ 3 1. Короткі теоретичні відомості 4 1.1 Таблиці ідентифікаторів 4 1.1.1 Метод бінарного дерева 5 1.1.2 Хешування 6 1.2 Лексичний аналізатор 7 1.3 Синтаксичний аналізатор 9 1.4 Генерація об’єктного коду 11 2. Завдання Для програмної організації компілятора рекомендується використовувати Borland Delphi: Компілятор повинен складатися: 1) лексичний аналізатор 2) синтаксичний аналізатор 3) оптимізатор 4) генератор результуючого кода Для побудови компілятора бажано використовувати методи застосовані при виконанні лабораторної роботи. Варіант - 5 1) Тип констант: вісімкові 2) Додаткові операції: >> until 4) Оптимізація: виключення зайвих операцій 5) Тип даних: integer 6) Тип коментарів: {коментарій} 1. Короткі теоретичні відомості 1.1 Таблиці ідентифікаторів Способи організації таблиць ідентифікаторів: 1) прості і впорядковані списки 2) бінарне дерево 3) хеш-адресація з ре хешуванням 4) хеш-адресація за методом ланцюжків 5) комбінація хеш-адресації зі списком або бінарним деревом Задача компілятора в тому, щоб зберігати інформації про кожний елемент початкової програми і ати доступ до цієї інформації по імені елемента. Тому пошук має бути максимально швидким. 1.1.1 Метод бінарного дерева В цьому методі кожний вузол дерева є елементом таблиці, кореневим вузлом стає перший елемент, який компілятор зустрів при заповненні таблиці. Алгоритм роботи бінарного дерева: 1) Перший - заноситься в вершину дерева, наступні попадають в дерево за таким алгоритмом: 2) 1) вибрати черговий ідентифікатор з потоку, якщо чергового нема, то побудова закінчена 3) зробити поточним вузлом дерева кореневу вершину 4) порівняти ім’я чергового ідентифікатора з іменем ідентифікатора який міститься в поточному вузлі 5) якщо ім’я чергового ідентифікатора менше - перейти до кроку 5, якщо дорівнює - зупинити алгоритм, оскільки однакових ідентифікаторів бути не повинно, інакше - перейти до кроку 7 6) якщо у поточного вузла існує ліва вершина, то зробити її поточним вузлом и повернутися до кроку 3, інакше - до кроку 8 7) створити нову вершину, помістити в неї інформацію про черговий ідентифікатор, зробити цю нову вершину лівою вершиною поточного вузла і перейти до кроку 1 8) якщо у поточного вузла є права вершина, то зробити її поточним вузлом і повернутися до кроку 3, інакше - до кроку 8 9) створити нову вершину, помістити в неї інформацію про черговий ідентифікатор, зробити нову вершину правою вершиною поточного вузла і перейти до кроку 1 Пошук називається бінарним тому, що на кожному кроці об’єм розгляданої інформації скорочується в 2 рази, тобто шуканий символ порівнюється з (n 1)/2 елементами в середині таблиці, якщо співпадінь немає, то переглядається блок елементів пронумерованих від 1 до (n 1)/2-1 або від (n 1)/2 до n в залежності від того менше чи більше шуканий елемент порівнюваного, далі процес повторюється над блоком вдвічі меншого розміру. необхідність прийнятного вибору хеш-функції 1.2 Лексичний аналізатор Лексичний аналізатор - це частина компілятора, яка читає літери програми на вхідній мові і будує з них слова (лексеми) початкової мови. Тріада - запис операцій в формі з 3 складових: операція і 2 операнди. FormLab unit FormLab4; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, Grids, ExtCtrls, LexElem, SyntSymb, Triads; type { Типы возможных ошибок компилятора: файловая, лексическая, синтаксическая, семантическая (триады) или ошибок нет } TErrType = (ERR_FILE, ERR_LEX, ERR_SYNT, ERR_TRIAD, ERR_NO); TCursovForm = class(TForm) PageControl1: TPageControl; SheetFile: TTabSheet; SheetLexems: TTabSheet; BtnExit: TButton; GroupText: TGroupBox; ListIdents: TMemo; EditFile: TEdit; BtnFile: TButton; BtnLoad: TButton; FileOpenDlg: TOpenDialog; GridLex: TStringGrid; SheetSynt: TTabSheet; TreeSynt: TTreeView; SheetTriad: TTabSheet; GroupTriadAll: TGroupBox; Splitter1: TSplitter; GroupTriadSame: TGroupBox; Splitter2: TSplitter; GroupTriadConst: TGroupBox; ListTriadAll: TMemo; ListTriadConst: TMemo; ListTriadSame: TMemo; CheckDel_C: TCheckBox; CheckDelSame: TCheckBox; SheetAsm: TTabSheet; ListAsm: TMemo; CheckAsm: TCheckBox; procedure BtnLoadClick(Sender: TObject); procedure BtnFileClick(Sender: TObject); procedure EditFileChange(Sender: TObject); procedure BtnExitClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Список лексем } listLex: TLexList; { Синтаксический стек } symbStack: TSymbStack; { Список триад } listTriad: TTriadList; { Имена файлов: входного, результата и ошибок } sInpFile,sOutFile,sErrFile: string; { Функция записи стартовых данных в файл ошибок } procedure StartInfo(const sErrF: string); { Функция обработки командной строки } procedure ProcessParams( var flOptC,flOptSame,flOptAsm: Boolean); { Процедура инициализации таблицы для отображения списка лексем } procedure InitLexGri