3.4
Исходными данными являются:
· постфиксная запись, построенная в лабораторной работе №3;
· таблицы лексем.
Результатом выполнения лабораторной работы является программа на языке Ассемблер.
Входной поток генератора кода являет собой промежуточное представление исходной программы, полученное на начальных стадиях компиляции, вместе с таблицей символов, которая используется для определения адресов времени исполнения объектов данных, обозначаемых в промежуточном представлении токенами.
Промежуточное представление программы:
«четверка» – конструкция, содержащая первый операнд, второй операнд, результат и код операции
struct four
{
int first[3];
int second[3];
int result[3];
int op;
} Four;
4.Текст программы.
4.1
#include <stdio.h>
#include <vector>
using namespace std;
#define NW 3
#define NR 18
#define SIM 16
char Symbols[SIM]={'+', '-', ' ', '\n', '\t', '<', '>', ',', ';', '=', '(', ')', '/', '*', '{', '}'};
char Words[NW][6]={"int", "while", "main"};
char Razdel[NR][3]={"+", "-", "=", "<=", ">=", "<", ">", "(", ")", "{", "}", ";", ",", " ", "\n", "\t", "//", "/*"};
struct Name
{
int init;
char data[80];
void *adress;
} N;
struct Const
{
int data;
void *adress;
} C;
class Variables
{
vector<Name> end[52];
public:
char *getname(int, int);
int getinit(int, int);
int hesh(char*);
int push(char*);
int find(char*);
int setinit(char*);
int setadress(char*, void*);
};
class Constants
{
vector<Const> end[10];
public:
int getconst(int, int);
int hesh(int);
int push(int);
int find(int);
int setadress(int, void*);
};
int findSymbol(char c)
{
if (c>='A' && c<='Z' || c>='a' && c<='z') return 1;
if (c>='0' && c<='9') return 2;
for (int i=0; i<SIM; i++)
if (c==Symbols[i])
return 3;
return 0;
}
int findWord(char *str)
{
for (int i=0; i<NW; i++)
if (!strcmp(Words[i],str))
return i;
return -1;
}
int findRazdel(char *str)
{
for (int i=0; i<NR; i++)
if (!strcmp(Razdel[i],str))
return i;
return -1;
}
int Variables::hesh(char* str)
{
if (str[0]>='A' && str[0]<='Z') return str[0]-'A';
else if (str[0]>='a' && str[0]<='z') return str[0]-'a'+26;
else return -1;
}
int Variables::push(char *str)
{
int s=0, k=hesh(str);
if (k>=0)
{
s=end[k].size();
N.init=0;
strcpy(N.data,str);
end[k].push_back(N);
}
return end[k].size()-s;
}
int Variables::find(char *str)
{
int k=hesh(str);
if (k>=0)
for (int i=0; i<end[k].size(); i++)
if (!strcmp(end[k][i].data,str)) return i;
return -1;
}
int Variables::setinit(char *str)
{
int k=hesh(str), i=find(str);
if (k>=0 && i>=0) {end[k][i].init++; return 1;}
return 0;
}
int Variables::setadress(char *str, void *adr)
{
int k=hesh(str), i=find(str);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.