Проектировании транслятора (язык проектирования Си++) с языка Си++ на язык Ассемблер (Лабораторная работа № 1-4), страница 3

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);