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

            if (k>=0 && i>=0) {end[k][i].adress=adr; return 1;}

            return 0;

}

char* Variables::getname(int a, int b)

{

            return end[a][b].data;

}

int Variables::getinit(int a, int b)

{

            return end[a][b].init;

}

int Constants::hesh(int c)

{

            c=abs(c);

            while (c/10) c/=10;

            return c;

}

int Constants::push(int c)

{

            int s=0, k=hesh(c);

            if (k>=0)

            {

                        s=end[k].size();

                        C.data=c;

                        end[k].push_back(C);

            }

            return end[k].size()-s;

}

int Constants::find(int c)

{

            int k=hesh(c);

            if (k>=0)

                        for (int i=0; i<end[k].size(); i++)

                                    if (end[k][i].data==c)

                                               return i;

            return -1;

}

int Constants::setadress(int c, void *adr)

{

            int k=hesh(c), i=find(c);

            if (k>=0 && i>=0) {end[k][i].adress=adr; return 1;}

            return 0;

}

int Constants::getconst(int a, int b)

{

            return end[a][b].data;

}

4.2

#include <conio.h>

#include "laba1.cpp"

FILE *in,*token,*error;

char buffer;

int buf=0, num=1;

Variables Var;

Constants Con;

int komment() //пропуск комментария на /*

{

      char c;

      int b=1;

      do

      {

            fscanf(in,"%c",&c);

            if (c=='*')

            {

                  do fscanf(in,"%c",&c);while (c=='*');

                  if (c=='/') b=0;

            }

            if (c=='\n') num++;

      } while (b && !feof(in));

      return !b;

}

int nextline() //пропуск комментария на //

{

      char str[80];

      fscanf(in,"%s",str);

      return 1;

}

int scan(char *term) //считывание терма

{

      char c;

      int n, i=0;

      if (!buf) fscanf(in,"%c",&c);

      else {c=buffer; buf=0;}

      n=findSymbol(c);

      if (!n) {term[0]=c; term[1]='\0'; return 0;} //недопустимый символ

      if (n==1) // начинается с буквы (идентификатор)

      {

            do

            {

                  term[i]=c; i++; //добавляем символ в выходной терм

                  fscanf(in,"%c",&c);

                  n=findSymbol(c);

            } while ((n==1 || n==2) && !feof(in));

            if (n==1 || n==2) {term[i]=c; term[i+1]='\0'; return 1;}

            if (n==3) {term[i]='\0'; buffer=c; buf=1; return 1;}

            do {term[i]=c; i++; fscanf(in,"%c",&c); n=findSymbol(c);}

            while (n!=3);

            term[i]='\0';

            buffer=c; buf=1;

            return -1;

      }

      if (n==2) // начинается с цифры (константа)

      {

            do

            {

                  term[i]=c; i++; //добавляем символ в выходной терм

                  fscanf(in,"%c",&c);

                  n=findSymbol(c);

            } while (n==2 && !feof(in));

            if (n==2) {term[i]=c; term[i+1]='\0'; return 2;}

            if (n==3) {term[i]='\0'; buffer=c; buf=1; return 2;}

            do {term[i]=c; i++; fscanf(in,"%c",&c); n=findSymbol(c);}

            while (n!=3);

            term[i]='\0';

            buffer=c; buf=1;

            return -2;

      }

      term[0]=c; // обработка разделителя

      if (c=='<' || c=='>' || c=='/')

      {

            fscanf(in,"%c",&c);

            n=findSymbol(c);

            if (n==3) {term[1]=c; i++;}

            else {buffer=c; buf=1;}

      }

      term[i+1]='\0';

      return 3;

}

void main1()

{

      int n, i;

      char file[80], term[80];

      //in=fopen("input.txt","r");

      //fscanf(in,"%s",file);

      //fclose(in);

      in=fopen("test.txt","r");