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)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.