- •Национальный исследовательский университет «Московский энергетический институт» Институт автоматики и вычислительной техники Кафедра математического моделирования
- •Оглавление
- •Void Prints(rez &r)
- •Void __fastcall tForm1::BitBtn1Click(tObject *Sender)
- •LeksBlok.H
- •Void Strcpy(char mas[], int n, char *txt, int m);
- •Void LeksichBlok(Ident &I, char *txt);
- •LeksBlok.Cpp
- •Void LeksichBlok(Ident &I, char *txt)
- •Sintaksis.H
- •Void Sint(Ident &I, rez &r);
- •Sintaksis.Cpp
- •Void Sint(Ident &I, rez &r)
- •Interpretator.H
- •Void Inter(Ident &I, rez &r);
- •Interpretator.Cpp
- •Void Inter(Ident &I, rez &r)
- •Data.Cpp
- •Ident::Ident()
- •Void Ident::Delete(elem el)
- •Stack_mass.H
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