РОЗРОБКА СИСТЕМНИХ ПРОГРАМНИХ МОДУЛІВ ТА КОМПОНЕНТ СИСТЕМ ПРОГРАМУВАННЯ

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
КН
Кафедра:
Кафедра ЕОМ

Інформація про роботу

Рік:
2013
Тип роботи:
Звіт
Предмет:
Системне програмування

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти і науки, молоді та спорту України Національний університет “Львівська політехніка” / Кафедра ЕОМ РОЗРОБКА СИСТЕМНИХ ПРОГРАМНИХ МОДУЛІВ ТА КОМПОНЕНТ СИСТЕМ ПРОГРАМУВАННЯ Звіт до курсової роботи з курсу “ Системне програмування ” Зміст Вступ Огляд методів та способів проектування трансляторів Формальний опис вхідної мови програмування Деталізований опис вхідної мови в термінах розширеної нотації Бекуса-Наура Термінальні символи та ключові слова Розробка транслятора вхідної мови програмування Вибір технології програмування Проектування таблиць транслятора Розробка лексичного аналізатора Розробка синтаксичного та семантичного аналізатора Розробка генератора коду Опис програми Опис інтерфейсу та інструкція користувачеві Відлагодження та тестування програми Виявлення лексичних помилок Виявлення синтаксичних помилок Виявлення семантичних помилок Загальна перевірка коректності роботи транслятора Висновки Список літератури Додатки Додаток 1. Вхідний файл для генератора Flex Додаток 2. Вхідний файл для генератора Bison Додаток 3. Код файлу для зв’язку Flex і Bison Додаток 5. Код лексичного аназізатора Завдання на курсову роботу. Цільова мова транслятора асемблер (iх86). Для отримання виконавчого файлу на виході розробленого транслятора скористатися програмамою masm32. Мова розробки транслятора: ANSI C. Реалізувати оболонку або інтерфейс з командного рядка. На вхід розробленого транслятора має подаватися текстовий файл, написаний на заданій мові програмування. На виході розробленого транслятора мають створюватись чотири файли: файл з повідомленнями про помилки (або про їх відсутність); файл на мові асемблера; об’єктний файл; виконавчий файл. Назва вхідної мови програмування утворюється від першої букви у прізвищі студента та останніх двох цифр номера його варіанту. Саме таке розширення повинні мати текстові файли, написані на цій мові програмування. Для мого варіанту це буде .Р56 . В табл.1 наведено деталізований опис вхідної мови Табл.1 деталізований опис вхідної мови. Номер варіанту 56  Блок тіла програми #Program <name>; Start Variable…; Stop  Оператор вводу/виводу streamget/streamset  Оператор присвоєння ::  Умовний оператор if [–else] (СІ)  Регістр ключових слів Up-Low перший символ Up  Регістр іден-тифікаторів Up6  Операції арифметичні ++; --; **; div; mod   порівняння eg; ne; >>; <<   логічні !!; &&; ||  Типи даних int16_t  Коментар $$ ...   Вступ Через існування великої кількості різних мов програмування, а також різних типів процесорів з різними асемблерами виникає неопхідність створення трансляторів. Транслятором називається програма перекладу (трансляції) початкової програми, записаної вхідною мовою, в еквівалентну їй записану вихідною мовою. Якщо мова високого рівня є вхідною, а мова асемблера чи машинні коди – вихідною, то такий транслятор називається компілятором, а процес трансляції відповідно називається асемблюванням або компіляцією. Транслятор виконує всі етапи компіляції: лексичний аналіз, синтаксичний аналіз та генерація коду. При лексичному аналізі вхідна послідовність символів розбивається на лексеми, які записуються у відповідну таблицю лексем. Кожній лексемі присвоюється число, адже числа легше порівнювати, ніж символи. Також у таблицю лексем записується додаткова інформація: рядок, у якому розміщується лексема; значення, якщо тип лексеми відповідає числу; та ін.. Для синтаксичного аналізу використовується метод операторного передування. Для реалізації цього методу використовуються пріоритети між різними операторами. На основі цих пріоритетів встановлюється співвідношення та відбувається згортка операторів, чи видається повідомлення про помилку. На етапі генерації коду відбувається повторне зчитування таблиці лексем та формується відповідний асемблерний код для кожного блоку лексем. Отриманий код записується у результуючий файл та готовий до виконання. Отриманий у результаті трансляції код, можна відкомпілювати за домогою відповідних програм (TLINK, TASM чи ін.). 1. Огляд методів та способів проектування трансляторів. Транслятор - обслуговуюча програма, що перетворює вихідну програму, надану на вхідній мові програмування, у робочу програму, представлену на об'єктною мовою. Наведене визначення відноситься до всіх різновидів транслюють програм. Однак у кожної з таких програм можуть бути свої особливості щодо організації процесу трансляції. В даний час транслятори поділяються на три основні групи: асемблери, компілятори та інтерпретатори. Асемблер - системна обслуговуюча програма, яка перетворить символічні конструкції в команди машинної мови. Специфічною рисою асемблером є те, що вони здійснюють дослівну трансляцію однієї символічної команди в одну машинну. Таким чином, мова асемблера (ще називається автокодом) призначена для полегшення сприйняття системи команд комп'ютера і прискорення програмування в цій системі команд. Компілятор - це обслуговуюча програма, що виконує трансляцію на машинну мову програми, записаної мовою оригіналу програмування. Також як і асемблер, компілятор забезпечує перетворення програми з однієї мови на іншу (найчастіше, в мову конкретного комп'ютера). Разом з тим, команди вихідної мови значно відрізняються з організації та потужності від команд машинної мови. Існують мови, в яких одна команда вихідного мови транслюється в 7-10 машинних команд. Однак є й такі мови, в яких кожній команді може відповідати 100 і більше машинних команд (наприклад, Пролог). Крім того, у вихідних мовах до часто використовується строга типізація даних, що здійснюється через їх попередній опис. Інтерпретатор - програма або пристрій, що здійснює пооператорну трансляцію і виконання вихідної програми. На відміну від компілятора, інтерпретатор не породжує на виході програму на машинній мові. Розпізнавши команду вихідного мови, він тут же виконує її. Як у компіляторах, так і в інтерпретатора використовуються однакові методи аналізу вихідного тексту програми. Але інтерпретатор дозволяє почати обробку даних після написання навіть однієї команди. Це робить процес розробки і налагодження програм більш гнучким. Крім того, відсутність вихідного машинного коду дозволяє не "захаращувати" зовнішні пристрої додатковими файлами, а сам інтерпретатор можна досить легко адаптувати до будь-яких машинних архітектур, розробивши його тільки один раз на широко поширеному мовою програмування. Синтаксис - сукупність правил деякої мови, що визначають формування його елементів. Інакше кажучи, це сукупність правил освіти семантично значущих послідовностей символів в даній мові. Синтаксис задається за допомогою правил, які описують поняття деякої мови. Прикладами понять є: змінна, вираз, оператор, процедура. Семантика - правила та умови, що визначають співвідношення між елементами мови та їх смисловими значеннями, а також інтерпретацію змістовного значення синтаксичних конструкцій мови. Об'єкти мови програмування не тільки розміщуються в тексті у відповідності з певною ієрархією, а й додатково пов'язані між собою. Всі мови програмування мають ряд загальних характеристик і параметрів.. Ця спільність визначає і схожі для всіх мов принципи організації трансляторів. Мови програмування призначені для полегшення програмування. Тому їхні оператори та структури даних більш потужні, ніж в машинних мовах. Для підвищення наочності програм замість числових кодів використовуються символічні або графічні представлення конструкцій мови, більш зручні для їх сприйняття людиною. Для будь-якої мови визначається: набір символів, які можна використовувати для запису правильних програм (алфавіт), основні елементи. Набір правильних програм (синтаксис). "Сенс" кожної правильної програми (семантика). Незалежно від специфіки мови будь-який транслятор можна вважати функціональним перетворювачем F, що забезпечує однозначне відображення X в Y, де X - програма мовою оригіналу, Y - програма на вихідному мовою. З огляду на схожість компілятора й інтерпретатора, розглянемо фази, що існують в компіляторі. У них виділяються: Фаза лексичного аналізу. Фаза синтаксичного аналізу, що складається з: розпізнавання синтаксичної структури; семантичного аналізу, в процесі якого здійснюється робота з таблицями, породження проміжного семантичного подання або об'єктної моделі мови. Фаза генерації коду, що здійснює: семантичний аналіз компонент проміжного подання або об'єктної моделі мови; переклад проміжного подання або об'єктної моделі в об'єктний код. Поряд з основними фазами процесу трансляції можливі також додаткові фази: Фаза дослідження та оптимізації проміжного представлення, що складається з: аналізу коректності проміжного представлення; оптимізації проміжного представлення. 3а. Фаза оптимізації об’єктного коду. Узагальнена структура компілятора, що враховує існуючі в ньому фази, представлена на рис.1.1 : / Рис. 1.1 - Узагальнена структура компілятора Він складається з лексичного аналізатора, синтаксичного аналізатора, генератора коду, аналізатора помилок. У інтерпретаторі замість генератора коду використовується емулятор, до якого, крім елементів проміжного представлення, передаються вихідні. Для прискорення розробки лексичного і синтаксичного аналізаторів існують генератори лексичних і синтаксичних аналізаторів Felex і Bison. Flex і Bison - це просто функції написані на мові С. Детальний опис генератора Flex: Flex - це інструмент для лексичного аналізу, що може використовуватись для виділення з початкового тексту певних рядків наперед заданим способом. На вході отримує текст у вільному форматі й правила виділення лексем. На виході дає код аналізатора, в вигляді функції на мові C[5]. Правила задаються в вигляді регулярних виразів ліворуч і, здебільшого, коду на мові C праворуч. Правила містять три секції, відокремлені рядком «%%»: визначення %% правила %% код користувача Визначення містять стартові значення й визначення, правила, безпосередньо самі вирази й дії, що відповідають їм, користувацький код просто включається в вивід flex. Деякі секції можуть бути відсутніми. Функція аналізатора отримує текст на вході й виконує заданий код для кожної знайденої лексеми. Детальний опис генератора Bison: Bison - це генератор синтаксичних аналізаторів загального призначення, який перетворює опис контекстно-вільної LALR граматики в програму мовою C для розбору цієї граматики. Bison можна використовувати для розробки аналізаторів мов досить широкого класу: від тих, що використовуються в простих настільних калькуляторах до складних мов програмування. Для того, щоб Bison міг розібрати програму якоюсь мовою, ця мова має бути описана контекстно-вільною граматикою. {% Оголошення С }% Оголошення Bison %% Правила граматики %% Додатковий код на С Оголошення C можуть визначати типи і змінні, використовувані в діях. В них також можуть використовуватися команди препроцесора для визначення використовуваних там макросів та #include для включення файлів заголовків, які роблять все вказане вище. Оголошення Bison вказують назви термінальних та нетермінальних символів і можуть також описувати пріоритет операцій і типи даних семантичних значень різних символів. Правила граматики визначають, як кожен нетермінальний символ збирається зі своїх частин. Додатковий код на C може містити будь-який код на C. Часто тут перебуває визначення лексичного аналізатора yylex і підпрограми, що викликаються діями правил граматики. У простих програмах тут може бути і решта програми. 2.Формальний опис вхідної мови програмування. 2.1. Деталізований опис вхідної мови в термінах розширеної нотації Бекуса-Наура. Однією з перших задач, що виникають при побудові компілятора, є визначення вхідної мови програмування. Для цього використовують різні способи формального опису, серед яких я застосував нотацію Бекуса-Наура. Нотації Бекуса-Наура для індивідуального завданя : <програма> ::= <заголовок програми> <блок> <заголовок програми> ::= #Program <і’мя>; <блок> ::= start<оголошення змінних><розділ операторів>stop <оголошення змінних> ::= <пусто>|<оглошення змінної>;|<оголошення змінних> <оголошення змінної> <оглошення змінної> ::=Variable <ім’я> : int16_t ; <розділ операторів> ::=<одиночний оператор>|<розділ операторів><одиночний оператор> <одиночний оператор>::= <оператор присвоювання> | <умовний оператор> |<оператор виведення>| <оператор введення> <оператор введення> ::= <змінна> :: streamget; <оператор виведення>::= streamset :: <змінна>;|streamset :: <константа>; <оператор присвоювання> ::= <змінна> :: <вираз>; <умовний оператор> ::= if ”(“ <вираз> “)” “{“{<розділ операторів>;}”}” [else “{”{<розділ операторів>;}”}”] <змінна> ::= <ім’я> <вираз> ::= <простий вираз>| <вираз> <операція відношення> <простий вираз> <простий вираз> ::= < аргумент > |<простий вираз> <операція> <агрумент> <аргумент> ::= <змінна>|<констаннта> <констаннта>::= <число>[{<число>}] < операція> ::= ++ | --|** | && | !!| \|\| | div | mod <операція відношення> ::= eg | ne | << | >> <і’мя> ::= <буква> {<буква> | <цифра>} <буква>::=a|b|c|d|e|f|g|h|i|j|k|l|n|m|o|p|q|r|s|t|u|v|w|x|y|z <цифра>::=0|1|2|3|4|5|6|7|8|9 2.2. Термінальні символи та ключові слова. Неопхідні термінальні символи та ключові слова наведені в табл.2. Табл.2 Термінальні символи та ключові слова. Назва символу Опис термінального символу  #Program  початок тексту програми, наступним описується ім’я програми;  Variable блок опису змінних;  Start початок тіла програми (циклу);  Stop кінець тіла програми (циклу);   streamget оператор виводу  streamset оператор вводу змінних;  ::  оператор присвоєння;  ++  операція додавання  --  операція віднімання  **  операція множення  if умовний оператор  else оператор якщо умова не виконується  {  відкриваюча дужка;  } закриваюча дужка;  div операція ділення  mod операція знаходження залишку від ділення;  eg  операція перевірки на рівність;  ne  перевірка на нерівність;  <<  перевірка чи менше;  >>  перевірка чи більше/рівно;  !!  операція логічного заперечення;  &&  кон’юнкція;  ||  диз’юнкція;  int16_t 16ох розрядні знакові цілі;  $$ рядковий коментар  ,  розділювач між деклараціями змінних;  ; ознака кінця оператора;  (  відкриваюча дужка;  )  закриваюча дужка;  (0-9) усі арабські цифри  (a-z, A-Z латинські букви  "\t” символи табуляції  “\n” символ переходу на нову стрічку  “ ” пробіл   3. Розробка транслятора вхідної мови програмування 3.1. Вибір технології програмування. Мовою програмування була вибрана мова С завдяки швидкодії робзроблених на ній програми, а середовищем розробки Microsoft VisualStudio2010. Лексичний та синтаксичний аналізатори будуть розроблені за допомогою генератора лексиних аналізаторів Flex, та генератора синтаксичних аналізаторів Bison. Опис генератора лесичних аналізаторів Flex: Flex- це інструмент для лексичного аналізу, що може використовуватись для виділення з початкового тексту певних рядків наперед заданим способом. На вході Flex отримує текст у вільному форматі й правила виділення лексем. На виході дає код аналізатора, в вигляді функції на мові C з назвою yylex(). Опис генератора синтаксичних аналізаторів Bison : Bison (бізон) — генератор синтаксичних аналізаторів загального призначення, який перетворює опис контекстно-вільної LALR граматики в програму мовою C для синтаксичного аналізу текстів відносно заданої граматики. На вході Bison  отримує текст у вільному форматі й правила граматики. На виході дає код аналізатора, в вигляді функції на мові C з назвою yyparce(). 3.2. Проектування таблиць транслятора. Оскільки використовувалася зв’язка генераторів Flex і Bison для реалізації аналізу простіше використовувати одну таблицю. Поля таблиці: class LexData { public: int type;// тип лексеми int value;//значення цілочисельної константи char string[1000];//назва ідентифікатора int line;//номер рядка де розміщена лексема bool is_ident;//чи лексема ідентифікатор }; Перелік типів лексем задається у вхідному файлі з граматиками для генератора Bison. Перелік типів лексем %token NULLL %token PROGRAM %token START %token STOP %token PLUS %token MINUS %token MUL %token DIV %token MOD %token EG %token NE %token LEFT %token RIGHT %token SPLAT %token AND %token OR %token INT_16_T %token COMENTAR %token SETVALUE %token STREAMGET %token STREAMSET %token VARIABLE %token IF %token ELSE %token ENDLINE %token POINT_POINT %token COMA %token CLOSING_BRACE //зкриваюча фігурна дужка %token OPEN_BRACE //відкриваюча фігурна дужка %token CLOSING_BRACKET //зкриваюча кругла дужка %token OPEN_BRACKET //відкриваюча кругла дужка %token ERROR 3.3. Розробка лексичного аналізатора. Лексичний аналіз – перша фаза трансляції, призначена для групування символів вхідного ланцюга в більш крупні конструкції, що називаються лексемами. З кожною лексемою зв’язано два поняття: Клас лексеми, що визначає загальну назву для категорії елементів, що мають спільні властивості (наприклад, ідентифікатор, ціле число, рядок символів і т. д.). Значення лексеми, що визначає підрядок символів вхідного ланцюга, що відповідають розпізнаному класу лексеми. В залежності від класу, значення лексеми може бути перетворено у внутрішнє представлення вже на етапі лексичного аналізу. Так, наприклад, роблять з числами, перетворюючи їх в машинне двійкове представлення, що забезпечує більш компактне зберігання і перевірку правильності діапазону на ранній стадії аналізу. Для лексичного аналізу вибрано генератор лексичних аналізаторів Flex 3.3.1Розробка лексичного аналізатора за допомогою генератора лексичних аналізаторів Flex. Для розробка лексичного аналізатора нам достатньо визначень термінальних і не термінальних символів з нотацій Бекуса-Наура. %{ #include "KNode.h" #include "string.h" #include "my_bison.cpp.h" #include <io.h> #include "Errors_head.h" #ifdef MSVC #define isatty _isatty #endif int line=1; %} ident ([A-Z])+ %% ([0-9])+ { LexData* Data = new LexData; Data->value=atoi(yytext); my_lval.Data=Data; Data->line=line; Data->type=TYPE_INT; return(INTEGER_CONSTANT); } "#Program" { LexData* Data = new LexData; Data->line=line; my_lval.Data=Data; return(PROGRAM); } "Streamget" { LexData* Data = new LexData; Data->line=line; my_lval.Data=Data; return (STREAMGET); } "Streamset" { LexData* Data = new LexData; Data->line=line; my_lval.Data=Data; return (STREAMSET); } "If" {LexData* Data = new LexData; Data->line=line; my_lval.Data=Data;return (IF);} "Else" {LexData* Data = new LexData; Data->line=line; my_lval.Data=Data;return (ELSE);} "Start" {LexData* Data = new LexData; Data->line=line; my_lval.Data=Data;return(START); } "Stop" {LexData* Data = new LexData; Data->line=line; my_lval.Data=Data; return(STOP); } "Variable" {LexData* Data = new LexData; Data->line=line; my_lval.Data=Data; return(VARIABLE); } "::" {LexData* Data = new LexData; Data->line=line; my_lval.Data=Data;return (SETVALUE);} ">>" {LexData* Data = new LexData; Data->line=line; my_lval.Data=Data; return(RIGHT); } "<<" {LexData* Data = new LexData; Data->line=line; my_lval.Data=Data;return (LEFT);} "(" {LexData* Data = new LexData; Data->line=line; my_lval.Data=Data;return(OPEN_BRACKET);} ")" {LexData* Data = new LexData; Data->line=line; my_lval.Data=Data;return(CLOSING_BRACKET);} "{" {LexData* Data = new LexData; Data->line=line; my_lval.Data=Data;return(OPEN_BRACE);} "}" {LexData* Data = new LexData; Data->line=line; my_lval.Data=Data;return(CLOSING_BRACE);} "!!" {LexData* Data = new LexData; Data->line=line; my_lval.Data=Data;return (SPLAT);} "||" {LexData* Data = new LexData; Data->line=line; my_lval.Data=Data;return (OR);} "&&" {LexData* Data = new LexData; Data->line=line; my_lval.Data=Data;return (AND);} "$$" {LexData* Data = new LexData; Data->line=line; my_lval.Data=Data;return (COMENTAR);} "Eg" {LexData* Data = new LexData; Data->line=line; my_lval.Data=Data;return (EG);} "Ne" {LexData* Data = new LexData; Data->line=line; my_lval.Data=Data;return (NE);} "Int_16_t" {LexData* Data = new LexData; Data->line=line; my_lval.Data=Data;return (INT_16_T);} "--" {LexData* Data = new LexData; Data->line=line; my_lval.Data=Data; return(MINUS); } "++" {LexData* Data = new LexData; Data->line=line; my_lval.Data=Data; return(PLUS); } "**" {LexData* Data = new LexData; Data->line=line; my_lval.Data=Data; return(MUL); } "Div" {LexData* Data = new LexData; Data->line=line; my_lval.Data=Data; return(DIV); } "Mod" {LexData* Data = new LexData; Data->line=line; my_lval.Data=Data;return (MOD);} ":" {LexData* Data = new LexData; Data->line=line; my_lval.Data=Data;return (POINT_POINT);} "," {LexData* Data = new LexData; Data->line=line; my_lval.Data=Data;return (COMA);} ";" {LexData* Data = new LexData; Data->line=line; my_lval.Data=Data;return(ENDLINE); } {ident} { LexData* Data = new LexData; Data->line=line; char*temp; temp=strtok (yytext," ,.-"); strcpy(Data->string,temp); Data->type=TYPE_VAR; my_lval.Data=Data;return(IDENTIFICATOR); } ([!-~]+) {LexData* Data = new LexData; Data->line=line; strcpy(Data->string,yytext); my_lval.Data=Data;return(ERROR); } [ \t\r]+ {} "\n" {++line;} . {} %% int yywrap() { return(1); } 3.3.2 Опис лексичного аналізатора. Згідно заданих правил у вхідному файлі генератора Flex, вхідний текст буде розбиватися на лексеми. Якщо при аналізі вхідного текстового файлу, зустрічається лексема аналізатор буде повертати її тип, як результат виконання функції my_lex. Типи лексем описані в вхідному файлі генератора Bison, тому у вхідному файлі генератора Flex необхідно імпортувати згенерований Bison-м заголовочний файл. Також через спеціальну змінну передається номер рядка в якому зустрілася лексема. Ця змінна має назву my_val, і представляє собою вказівник на об’єкт класу LexData. Коли знайденя лексема є числовою константою то крім типу лексеми і номера рядка, буде повернуто, ще й семантичне значення. Це відбудеть через визначення змінної LexData->value. При знаходженні ідентифікатора додатково передасться назва ідентифікатора через змінну LexData->string. 3.4 Розробка синтаксичного та семантичного аналізатора Синтаксичний аналізатор - частина компілятора, яка відповідає за виявлення основних синтаксичних конструкцій вхідної мови. У завдання синтаксичного аналізатора входить: знайти і виділити основні синтаксичні конструкції в тексті вхідної програми, встановити тип і перевірити правильність кожної синтаксичної конструкції у вигляді, зручному для подальшої генерації тексту результуючої програми. Для створення синтаксичного аналізатора було використано генератор синтаксичних аналізаторів Bison. Для нього на вхід подається файл, який містить задані спеціальним способом контекстно вільні граматики, а також код на мові С, який виконується при виявленні заданих синтаксичних конструкцій. Вхідні дані для аналізу згенерований Bison-м аналізатор отримує через функцію my_lex, яка повертає тип лексеми, а також семантичні значення через змінну my_val. При виявленні помилки робота синтакчисного аналізатора продовжиться, а дані про помилку додадуться в спеціальний клас з помилками. Після завершення аналізу, дані про помилки будуть занесені у файл Errors.txt. 3.5 Розробка генератора коду Оскільки вхідний файл Bison містить синтаксичні конструкції, а також дозволяє виділити семантичні значення лексем, доцільним є органузувати генерацію коду паралельно з синтаксичним аналізом. Розглянемо приклад генерації коду при оголошенні змінної: variable_declaration : o_varialbe name point_point int_16_t endline { fputs ("\n",pFile); fputs ($<Data>2->string,pFile); fputs (" dw 0",pFile); if(Ident.is_var($<Data>2->string)) Errors.do_error("Redefine a variable ",my_lval.Data->line); else Ident.add_var($<Data>2->string,Varialbe_name); } ; Як видно в коді задано правило оголошення змінної. В фігурних дужках цього правила представлено код на мові С, який виконається тоді коли буде знайдено конструкцію, яка буде йому відповідає. Для генерації коду використовується функція для виведення рядкових даних в файл fputs. За допомогою неї заносяться в файл дані неохідні для оголошення змінної, а саме: Назву ідентифікатора, яка міститься в семантичному значенні поля name. Розмірність даних. 4. Опис програми Створена програма проводить лексичний, синтаксичний, семантичний аналіз, а також генерацію коду. В результаті виконання утворюються чотири файли: об`єктний файл, виконуваний файл, файл з помилками та файл з згенерованим асемблерним кодом. Програма складається з наступних компонентів: 1.Клас KNode – він містить тип LexData, який використовується для передачі семантичних значень лексем, а також клас Identificators, який служить для створення ідентифікаторів. 2. Клас Errors_head – він містить неопхідні функції для збереження, додавання і виведеня помилок у файл. 3. Файл flex.f – він містить вхідні дані для генератора лексичних аналізаторів Flex. 4. Файл bison.b – він містить вхідні дані для генератора синтаксичних аналізаторів Bison. В результаті компіляції створюються файли : my_bison.cpp.h , my_bison.cpp my_lex.cpp . 5. Опис інтерфейсу та інструкція користувачеві. Для трансляції проекту необхідно записати в командному рядку назву транслятора «Parcer» і через пробіл шлях і назву файла з вхідною мовою, через наступний пробіл шлях і назву для вихідного файлу. Після виконання команди трансляції буде сформовано файл з асемблерним кодом, а також файл Errors.txt, який міститме дані про помилки. Для створення об’єктного і виконавчого файлів необхідно виконати в командному рядку дві наступні інсткурції. c:\masm32\bin\ml /c /coff “шлях\назва файлу”.asm c:\masm32\bin\link /SUBSYSTEM:CONSOLE /LIBPATH:c:\masm32\lib шлях\назва файлу.obj Після виконання цих двох команд буде створено об’єктний і виконавчий файли.
Антиботан аватар за замовчуванням

06.12.2014 16:12-

Коментарі

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

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!