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

      token=fopen("token.txt","w");

      error=fopen("error.txt","w");

      if (in==NULL) {fprintf(error, "sourse file not found!"); return;}

      do

      {

            n=scan(term);

            if (n>0) //правильный терм

            {

                  if (n==1) //слово

                  {

                        n=findWord(term);

                        if (n>=0) fprintf(token,"%d %d %d\t", 0,0,n);

                        else

                        {

                              n=Var.find(term);

                              if (n==-1) Var.push(term);

                              fprintf(token,"%d %d %d\t", 2,Var.hesh(term),Var.find(term));

                        }

                  }

                  else if (n==2) //число

                  {

                        i=atoi(term);

                        n=Con.find(i);

                        if (n==-1) Con.push(i);

                        fprintf(token,"%d %d %d\t", 3,Con.hesh(i),Con.find(i));

                  }

                  else

                  {

                        n=findRazdel(term);

                        if (n<0) fprintf(error,"%d string: incorrect razdelitel - %s\n",num,term); //ошибка

                        else if (n==NR-1) komment();

                        else if (n==NR-2) nextline();

                        else if (n<NR-5) fprintf(token,"%d %d %d\t", 1,0,n);

                        else if (n==NR-4) {fprintf(token,"\n"); num++;}

                  }

            }

            else if (!feof(in))//ошибка

                  if (n==0) fprintf(error,"%d string: unknown symbol - %s\n",num,term);

                  else if (n==-1) fprintf(error,"%d string: incorrect identifier - %s\n",num,term);

                  else fprintf(error,"%d string: incorrect constant - %s\n",num,term);

      } while (!feof(in));

      fcloseall();

}

4.3

#include <stdio.h>

#include <vector>

#include "2.cpp"

using namespace std;

struct table

{

            int terms[27];

            int n;

            int jump,accept,stack,ret,err;

};

table tab[75];

vector<int> Stack;

vector<int> st;

FILE *in2,*error2,*postfix;

int a1=0,b1=0,c1=0, info=0;

void init();

int find(int n, int a, int b, int c)

{

            int k=tab[n].n;

            for (int i=0; i<k; i++)

                        if (a>1)

                                    {if (a==tab[n].terms[i*3]) return 1;}

                        else if (a==tab[n].terms[i*3] && b==tab[n].terms[i*3+1] && c==tab[n].terms[i*3+2]) return 1;

            return 0;

}

void print(int a, int b, int c)

{

            fprintf(postfix, "%d %d %d\t", a, b, c);

}

void print(int n)

{

            fprintf(postfix, "%d %d %d\t", tab[n].terms[0], tab[n].terms[1], tab[n].terms[2]);

}

void post(int n, int a, int b, int c) // построение постфиксной записи

{

            int temp=n;

            if(n==32 || n==33 || n==38) print(a,b,c); // если нетерминал - вывод

            if(n==42) print(n); // "while" в начало записи - инструкция

            if(n==53) st.push_back(n); // '(' скобку засунуть в стек

            if(n==55) // встретили ')'

                        while(temp!=53) {temp=st[st.size()-1]; st.pop_back(); if(temp!=53) print(temp);} // если встретили ")", то извлечь всё из стека до "("

            if(n==69 || n==70) // + или -

            {

                        while(st[st.size()-1]!=53 && (st[st.size()-1]==69 || st[st.size()-1]==70))

                                    {temp=st[st.size()-1]; st.pop_back(); print(temp);}

                        st.push_back(n);

            }

            if(n>=71 && n<=74) // >= <= > <

            {

                        while(st[st.size()-1]!=53 && st[st.size()-1]!=22 && st[st.size()-1]!=39)