Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет Л.р.4 ШАВРОВА.docx
Скачиваний:
5
Добавлен:
31.03.2015
Размер:
1.49 Mб
Скачать

Interpretator.H

#ifndef InterpretatorH

#define InterpretatorH

#include "DataBase.h"

Void Inter(Ident &I, rez &r);

#endif

Interpretator.Cpp

#pragma hdrstop

#include "Interpretator.h"

#include "Stack_mass.h"

#include "LeksBlok.h"

//------------------------------------------------------------------------------------------------------------------------------------------------------

int pow (int x, int y) // x^y

{

if (y < 0) throw ErrInvChain(); //Отрицательная степень

int rezult = 1;

for (int i = 0; i < y; ++i)

rezult *= x;

return rezult;

}

//------------------------------------------------------------------------------------------------------------------------------------------------------

Void Inter(Ident &I, rez &r)

{

int size = R.Command.Size();

for (int i = 0; i < size; )

{

int el = R.Command[i];

switch (el)

{

case K_PRISV:

R.Data[R.Command[i + 1]].value = R.Data[R.Command[i + 2]].value;

i += 3;

break;

case K_SLOJ:

R.Data[R.Command[i + 3]].value = R.Data[R.Command[i + 2]].value + R.Data[R.Command[i + 1]].value;

i += 4;

break;

case K_UMNOJ:

R.Data[R.Command[i + 3]].value = R.Data[R.Command[i + 2]].value * R.Data[R.Command[i + 1]].value;

i += 4;

break;

case K_V_STEP:

R.Data[R.Command[i + 3]].value = pow(R.Data[R.Command[i + 1]].value, R.Data[R.Command[i + 2]].value);

i += 4;

break;

case K_PEREHOD_0:

if (R.Data[R.Command[i + 1]].value)

i += 3;

else

i = R.Label[R.Command[i + 2]];

break;

case K_PEREHOD_BEZ_USL:

i = R.Label[R.Command[i + 1]];

break;

case K_PEREHOD_SRAVN:

if (R.Data[R.Command[i + 1]].value)

i += 3;

else

i = R.Label[R.Command[i + 2]];

break;

case K_RAVNO:

R.Data[R.Command[i + 3]].value = (R.Data[R.Command[i + 2]].value == R.Data[R.Command[i + 1]].value);

i += 4;

break;

case K_NE_RAVNO:

R.Data[R.Command[i + 3]].value = (R.Data[R.Command[i + 2]].value != R.Data[R.Command[i + 1]].value);

i += 4;

break;

}

}

}

#pragma package(smart_init)

Data.h

#ifndef DataBaseH

#define DataBaseH

#define MAX_CHAR 25

#include "Stack_mass.h"

struct elem

{

int clas; //класс

int value; //значение (для идентификаторов и констант)

char name[MAX_CHAR]; //имя

int link; //ссылка

elem() //конструктор

{

clas = -1;

value = 0;

name[0] = '\0';

link = -1;

}

};

struct rez

{

Stack<elem> Data; //Область данных

Stack<int> Label; //Массив меток

Stack<int> Command; //Массив комманд

};

class ErrOverFlow {}; //ошибка переполнения массива mas

class ErrIdent {}; //буква сразу после цифры

class ErrSimb {}; //символ, отсутствующий в данной грамматике

class ErrSearch {}; //не найден искомый символ

class ErrInvChain {}; //невозможная цепочка

class Ident

{

private:

elem *mas;

int *ABC;

int size;

int end;

public:

Ident();

~Ident();

int Add (elem z);

int Search (elem el);

void Delete (elem el);

friend void Prints(Ident &I);

inline int Size() {return size;}

inline elem Get(int n) {return mas[ABC[n]];}

};

#endif