- •Курсова робота
- •Виконав ст. Гр. Кі-35:
- •Завдання на курсову роботу:
- •Анотація
- •1. Огляд методів та способів проектування трансляторів 7
- •Огляд методів та способів проектування трансляторів
- •Формальний опис вхідної мови програмування
- •Деталізований опис вхідної мови в термінах розширеної нотації Бекуса-Наура(Backus/NaurForm - bnf).
- •2.2.Термінальні символи та ключові слова
- •Розробка транслятора вхідної мови програмування
- •Вибір технології програмування
- •Проектування таблиць транслятора
- •Розробка лексичного аналізатора
- •Опис лексичного аналізатора
- •3.3.2. Розробка граф-схеми алгоритму
- •Розробка синтаксичного та семантичного аналізатора
- •Опис синтаксичного аналізатора
- •Повне дерево граматичного розбору
- •Розробка генератора коду
- •Опис генератора коду
- •Опис програми(в тому числі граф-схем)
- •Опис інтерфейсу та інструкція користувачеві
- •Відлагодження та тестування програми
- •Виявлення лексичних помилок.
- •Список літератури
- •Додаток а. Лістингпрограми.
- •Додаток б. Приклад програми із лексичними та синтаксичними помилками та текст файлу з повідомленням про помилки.
- •Додаток в. Приклад коректної програми та результат її виконання.
- •Додаток г. Граф-схема алгоритму виконання програми через використання функцій.
Опис програми(в тому числі граф-схем)
Дана програма написана мовою С++ з використанням визначень нових типів, перечислень та класів:
enum LexemType //
{ program_, //Початок програми
variable_, //Блок оголошення змінних
int_, // integer16_t-тип
start_, //Початок блоку
stop_, //Кінець блоку
input_, //Оператор вводу
output_, //Оператор виводу
if_, //
then_, //
else_, //
newval_, // :=
add_, //
sub_, //
mul_, //
div_, //
mod_, //
equ_, //
notequ_, //
le_, //
ge_, //
not_, //
and_, //
or_, //
eof_, //
EndGroup_, // ;
komma_, // ,
ident_,
number_,
LeftBraket_, // (
RightBraket_, // )
unknown_
};
typedef struct Lexem
{
char name[50];
int value;
LexemType type;
int line;
}Lexema;
typedef struct Ident
{
char name[50];
int value;
}Identifier;
typedef struct L //Структура-реєстр в якій зберігаються всі дані програми
{
Lexema LexArray[1000]; //Таблиця лексем
int length; //
Identifier IdTable[50]; //Таблиця ідентифікаторів
int idnum; //
int PFExpr[200]; //Буфер для виразу в постфіксній формі
}Data;
Data Reg;
typedef struct Stacks
{ int st[200];
int top; }StackType;
typedef class stack
{
public:
StackType S;
void Init(StackType* s)
{
s->top = -1;
}
void Push(int i, StackType* s)
{
if(IsFull(s))
{
puts("Stack error (is full)");
exit(0);
}
else
{
++s->top;
s->st[s->top] = i;
}
}
int Pop(StackType* s)
{
int i;
if(IsEmpty(s))
{
puts("Stack error (is empty)");
exit(0);
}
else
{
i = s->st[s->top];
--s->top;
}
return i;
}
bool IsEmpty(StackType* s)
{
if(s->top == -1)
{
return true;
}
else
{
return false;
}
}
bool IsFull(StackType* s)
{
if(s->top == 199)return true;
else return false;
}
void prints(StackType s)
{
int i=0;
for(;i<10;++i)
{
printf("%d_",s.st[i]);
}
}
}Stack;
Stack s;
Stack if_s;
Stack start_s;
В програмі також використовуються багато функцій тому вона є доволі структурованою (граф-схема алгоритму виконання програми розташована в додатку Г).
Головною функцією є int main(intargc, char* argv[])з якої і починає своє виконання програма. В ній прямо чи опосередковано викликаються наступні функції:
int Balans(int, LexemType, LexemType, LexemType); - визначає баланс дужок чи інших лексем між двома лексемами певного типу; повертає суму помилок;
void BeginASMFile(); - записує до вихідного файлу стандартну „шапку”;
void BeginCodeSegm();- записує до вихідного файлу стандартний початок сегменту коду;
void CheckPresentInputOutput();- перевіряє наявність в коді операторів вводу-виводу;
void CodeGenerator(FILE*); - за таблицями ідентифікаторів та лексем генерує вихідний код на мові асемблера;
int ConvertToPostfixForm(int); - перетворює вирази в постфіксну форму;
int FindErrors();- функція пошуку помилок у вхідному файлі. Повертає їх кількість;
void GenASMCode(const char *, FILE*); - генерує код для окремих операцій;
Lexema* GetLexema(FILE*); - повертає в LexicalAnalis чергову лексему;
bool IsElsePresent(int);- перевіряє наявність else у розгалуженні;
int IsExpression(int, FILE*); - перевірка, чи є дана послідовність лексем виразом;
bool IsOperation(LexemType); - перевірка, чи є дана лексема операцією;
int LexicalAnalyze(FILE*); - виконує лексичний аналіз і створює масив лексем;
void MakeLexOutFile(); - видруковує в файл масив лексем;
void PrintData(FILE*); - видруковує в вихідний файл сегмент коду, який крім введених змінних за умови присутності операторів вводу/виводу (CheckPresentInputOutput();) і службову інформацію для них та додаткові буфери;
void PrintCode(FILE*); - видруковує в вихідний файл основний код програми;
void PrintAND(FILE*); - видруковує в вихідний файл процедуру and_;
void PrintOR(FILE*); - видруковує в вихідний файл процедуру or_;
void PrintNOT(FILE*); - видруковує в вихідний файл процедуру not_;
void PrintEQ(FILE*); - видруковує в вихідний файл процедуру eq_;
void PrintGE(FILE*); - видруковує в вихідний файл процедуру ge_;
void PrintLE(FILE*); - видруковує в вихідний файл процедуру le_;
void PrintMOD(FILE*); - видруковує в вихідний файл процедуру mod_;
void PrintEnding(FILE*); - видруковує в вихідний файл стандартне завершення *.asm-файлу;
void PrintInput(FILE*); - видруковує в вихідний файл процедуру вводу;
void PrintOutput(FILE*); - видруковує в вихідний файл процедуру виводу;
bool Prioritet(LexemType,StackType); - перевіряє пріорітет операцій (використовується при перетворенні виразу у посифіксну форму).
