Інтерпритатор
Ціль роботи: розробити програму-інтерпритатор, виконуючий розбір тексту .ASM файлу на рівні команд.
Індивідуальне завдання: розробити програму - інтерпритатор команд мови assemblera. Виконати симантичний та синтаксичний аналіз тексту вхідного файлу.
Розробка алгоритму:
-ініціалізація об’єктів, використовуючи масив регістрів
-читання команди користувача
-визначення недопустимих операндів та невірних записів команд
-вибір вказаної команди та виконання запису в список класів
-виведення отриманих даних
Типи даних:
struct Reg {//список классов с констр и деструк
char* name;
int z;
Reg *next;
Reg(char *nam,int y,Reg *hea);
~Reg();
};
struct Reg *head,*current,*list;
struct Reg *currents;
Reg::Reg(char *nam,int y,Reg *hea){//констр
name=new char[strlen(nam)]; //новый эл на кот выдел заданая память
strcpy(name,nam);//запись в поле name класса
z=y;
next=hea; //голова
Текст програми:
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#define STACK_KOL 5
#define REG_KOL 8
int *Search(char *nam);//поиск в классе заданого регистра(nam) и возврат
// указ на его значение
int SearchPer(char *nam);
int zn(char *str); //определение числа в операнде
void convert(char *str); //преобр в верх регистр
void scroll(); //переход на позицию для вывода текста
void PutsReg(); //вывод всех регистров и их содержимого
void PrintPer(); //вывод переменных
void PrintStack(); //вывод содержимого стека
struct Reg {//список классов с констр и деструк
char* name;
int z;
Reg *next;
Reg(char *nam,int y,Reg *hea);
~Reg();
};
struct Reg *head,*current,*list;
struct Reg *currents;
Reg::Reg(char *nam,int y,Reg *hea){//констр
name=new char[strlen(nam)]; //новый эл на кот выдел заданая память
strcpy(name,nam);//запись в поле name класса
z=y;
next=hea;}
Reg::~Reg(){ //деструк
delete current->name;}
char mas[REG_KOL][3]={"AX","BX","CX","DX","SP","BP","SI","DI"};
int stack[STACK_KOL]; int dlina;
int *Search(char *nam){ //поиск в классе заданого регистра(nam) и возврат
list=current; // указ на его значение
Reg *dop; //объект
while (current){
if (!strcmp(nam,current->name)){
dop=current;
current=list;
return &dop->z; }
current=current->next; }
current=list; return NULL;
}
int SearchPer(char *nam){
list=current;
while (current){
if (!strcmp(nam,current->name)){
current=list; return 1; }
current=current->next; }
current=list; return 0;
}
void PutsReg(){ //вывод всех регистров и их содержимого
int k=64; list=currents;
while (currents){
gotoxy(k,20);
printf("%s=",currents->name);
currents=currents->next; k-=9; }
currents=list;k=67;
while (currents){
gotoxy(k,20);
printf("%04X",currents->z);
currents=currents->next; k-=9; }
currents=list; PrintStack(); //вывод стека
}
int zn(char *str){ //число ли это
int i=0;
while (str[i]!='\0'){
if(str[i]<'0' || str[i]>'9') return 0;
i++; } return 1;}
void convert(char *str){ //преобр в апкейс
int i=0;
while (i!=2){
if (str[i]>='a' && str[i]<='z') str[i]=str[i]-32;
i++; }}
void scroll(){ //переход на позицию для вывода текста
int i=0; gotoxy(1,24);
while (i!=5){ puts(""); i++; }}
void PrintPer(){ //вывод переменных
Reg *lists; int i=1;
lists=current;
while (current!=currents){
gotoxy(74,i);
printf("%s ",current->name);
printf("%04X",current->z); i++;
current=current->next; }
current=lists;}
void PrintStack(){ //вывод содержимого стека
int i=0; gotoxy(1,21);
while (i!=STACK_KOL){
printf("%04X ",stack[i]); i++; }}
void main(void){
clrscr(); char buff[255]; char com[20];
char op1[20]; char op2[20]; char *pbuff;
int i=0,k=0,per;
while (i!=REG_KOL){
current=new Reg(mas[i],0,head); //создание списка классов из mas[]
head=current; //голова i++; }
currents=current;
*Search("SP")=(STACK_KOL-1)*2;
while(1){
PrintPer();
PutsReg(); //вывод регистров
printf("\n-");
gets(buff); //чтение команды
pbuff=buff;
while (*pbuff != '\0'){ //отделение табов
if (*pbuff == '\t') *pbuff = ' '; pbuff++; }
if (!strcmp(buff,"q")) break; //q-выход
i=0;k=0;
strcpy(op1,""); //операнды 1 и 2
strcpy(op2,"");
while (buff[i]!=' ' && buff[i]!='\0'){
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.