Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Zapiska_-_31_1 (1).docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
536.65 Кб
Скачать
  1. Опис програми(в тому числі граф-схем)

Дана програма написана мовою С++ з використанням визначень нових типів, перечислень та класів:

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); - перевіряє пріорітет операцій (використовується при перетворенні виразу у посифіксну форму).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]