Автор: Пользователь скрыл имя, 20 Ноября 2012 в 23:12, курсовая работа
Посредством среды разработки «Borland C++ Builder6» осуществляется создание варианта программы-транслятора с одного языка высокого уровня на другой. Созданная программа имеет возможность находить некоторые лексические и синтаксические ошибки, которые могут быть допущены в исходном текстовом файле, предназначенном для трансляции и сообщать о них пользователю.
1. Пояснительная записка………………………………………………………..2
1.1. Задание на проектирование…………………………………………..2
1.2. Содержание…………………………………………………...……….3
1.3. Введение………………………………..………………………………4
1.4. Описание процесса решения задачи…………………………………5
1.5. Блок-схемы основной программы и процедур…………………….15
2. Распечатка программных модулей………………………………………….17
3. Описание программы………………………………………………………...39
3.1. Назначение и общее описание программы………………………...39
3.2. Описание логической структуры программы…………………… ..39
3.3. Способ обращения к программе……………………………………40
3.4. Перечень технических средств………………………………… …..40
4. Описание входных и выходных данных……………………………………40
5. Тестовые примеры работы программы………………..……………………41
case 4: {if(errmass[err]!=i){sprintf( s, "[Лексема
%d]Обнаружена неизвестная константа %s\n",i,CNST[mass[i]].name);
case 5: {if(errmass[err]!=i){sprintf( s, "[Лексема
%d]Отсутствует первый множитель \n",i,ID[mass[i+3]].name);
case 6: {if(errmass[err]!=i){sprintf( s, "[Лексема
%d]Отсутствует множитель \n",i+2,ID[mass[i]].name);
case 7: {if(errmass[err]!=i){sprintf( s, "[Лексема
%d]Отсутствует множитель \n",i+2,ID[mass[i]].name);
case 8: {if(errmass[err]!=i){sprintf( s, "[Лексема
%d]Отсутствует слагаемое\n",i);errornumber++;
case 9: {if(errmass[err]!=i){sprintf( s, "[Лексема
%d]Отсутствует первое
case 10: {if(errmass[err]!=i){sprintf( s, "[Лексема
%d]Неправильно оформленo условие\n",i);errornumber++;
case 11: {if(errmass[err]!=i){sprintf( s, "[Лексема
%d]Отсутствует вторая часть неравенства
или закрывающая скобка\n",i);errornumber++;
case 12: {if(errmass[err]!=i){sprintf( s, "[Лексема
%d]Отсутствует первая часть неравенства
или открывающая скобка\n",i);errornumber++;
case 13: {if(errmass[err]!=i){sprintf( s, "[Лексема
%d]Отсутствует оператор после условия\n",i);errornumber++;
case 14: {if(errmass[err]!=i){sprintf( s, "[Лексема
%d]Некоректно задано условие\n",i);errornumber++;
case 15: {if(errmass[err]!=i){sprintf( s, "[Лексема
%d]Некоректное арифметическое выражение
(%s= ???)\n",i,ID[mass[i-2]].name);
case 16: {if(errmass[err]!=i){sprintf( s, "[Лексема
%d]Некорректные атрибуты операции вывода
(writeln, ???)\n",i);errornumber++;
case 17: {if(errmass[err]!=i){sprintf( s, "[Лексема
%d]Отсутствует выражение слева от оператора
присваивания\n",i);
case 18: {if(errmass[err]!=i){sprintf( s, "[Лексема
%d]Некорректные атрибуты операции ввода(read,
???)\n",i);errornumber++;
case 19: {if(errmass[err]!=i){sprintf( s, "[Лексема
%d]Некорректно записан оператор ввода-вывода\n",i);
case 20: {if(errmass[err]!=i){sprintf( s, "[Лексема
%d]Недопустимое арифметическое действие\n",i);errornumber++;
case 21: {if(errmass[err]!=i){sprintf( s, "[Лексема %d]Отсутствует ; или :\n",i);errornumber++;break;}}
case 22: {if(i==0){sprintf( s, "[Лексема
%d]Ошибка в имени программы\n",i);errornumber++;
case 23: {if(errmass[err]!=i){sprintf( s, "[Лексема
%d]Отсутствует begin\n",i);errornumber++;
case 24: {if(errmass[err]!=i){sprintf( s, "[Лексема
%d]Отсутствует end\n",i);errornumber++;break;
case 25: {if(errmass[err]!=i){sprintf( s, "Количество
begin!= количеству end\n",i);errornumber++;break;
case 26: {if(errmass[err]!=i){sprintf( s, "[Лексема
%d]Отсутствует var\n",i);errornumber++;break;
case 27: {if(errmass[err]!=i){sprintf( s, "[Лексема
%d]Неправильное окончание программы (нет
end и точки)\n",i);errornumber++;
}
if(strcmp(s,"")) Form1->Memo3->Lines->Add(s);
errmass[err]=i;
OPERATOR(mass,i+1);
}
int DECLAR(int mass[], int i)
{
int res=0;
int j;
if (i==0&&mass[0]==1)
{
if(mass[i+1]!=21||mass[i+2]!=
{
res=0;
ERRORM(22,mass,i);
}
else i=i+3;
if(mass[i]!=17)
{
res=0;
ERRORM(22,mass,i);
}
else i++;
if(mass[i]==2&&mass[i-1]!=20&&
{
i++;
int f1=1;
do{
if(mass[i]==21)
{
for(j=0;j<MAX;j++)
{
if(j!=mass[i+1])
if(strcmp(ID[mass[i+1]].name,
{
res=0;
int k;
for(k=0;k<MAXL;k++) if((mass[k]==ID[j].nomer)&&
ERRORM(0,mass,k-1);
}
}
res=1;
}
i=i+2;
while(mass[i]==16)
{ i++;
if(mass[i]!=21)
{
res=0;
ERRORM(2,mass,i);
}
else
i=i+2;
}
if(mass[i]!=18)
{
res=0;
ERRORM(21,mass,i);
}
else
{
i++;
if(mass[i]==20&&mass[i-1]!=20&
{
if(mass[i+1]<1&&mass[i+1]>2)
{
res=0;
ERRORM(1,mass,i+1);
}
else i=i+2;
if(mass[i]!=17)
{
res=0;
ERRORM(21,mass,i);
}
}
}
i++;
}while(mass[i]==21);
}
else {
res=0;
ERRORM(26,mass,i);
}
if(mass[i]!=3&&mass[i-1]!=20&&
{
res=0;
ERRORM(23,mass,i+1);
}
else i++;
}
return res;
}
int MNOG(int mass[], int i)
{
int res=0;
int j=0;
if(mass[i]==21&&mass[i-1]!=20&
{
if(strcmp(ID[mass[i+1]].type,"
{
res=0;
ERRORM(3,mass,i+1);
}
else res=1;
}
if(mass[i]==22)
{
for(j=0;j<MAX;j++)
{
if(mass[i+1]==CNST[j].nomer)
{
res=1;
break;
}
}
if(j==MAX-1&&res==0) ERRORM(4,mass,i+1);
}
return res;
}
void BEGINEND(int mass[])
{
int i=0;
int nbegin=0;
int nend=0;
while(mass[i]!=0&&mass[i+1]!=
{
if(mass[i]==3&&mass[i-1]!=21&&
if(mass[i]==4&&mass[i-1]!=21&&
i++;
}
int res=1;
if(nbegin!=nend) ERRORM(25,mass,i);
}
int SLAG(int mass[], int i)
{
int res=0;
if(mass[i]==21&&(mass[i+2]==
{
res=0;
ERRORM(6,mass,i);
}
if(mass[i]==22&&(mass[i+2]==
{
res=0;
ERRORM(7,mass,i);
}
if(MNOG(mass,i)==1)
{
res=1;
i=i+2;
while((mass[i]==12||mass[i]==
{
i++;
if((mass[i-1]==13)&&(!strcmp(
if(MNOG(mass,i)==0)
{
res=0;
if(mass[i-3]==21) ERRORM(6,mass,i-2);
if(mass[i-3]==22) ERRORM(7,mass,i-2);
}
i=i+2;
}
}
if((mass[i]==12||mass[i]==13)&
{
if(MNOG(mass,i-2)==0)
{
res=0;
ERRORM(9,mass,i-1);
}
}
return res;
}
int ARV(int mass[], int i)
{
int res=0;
if(mass[i]==10&&mass[i]-1!=22&
i++;
if(SLAG(mass,i)==1)
{
i=i+3;
res=1;
while(SLAG(mass,i)==1&&mass[i-
if(mass[i]==11&&mass[i]-1!=22&
i++;
while((mass[i]==14||mass[i]==
{
i++;
if(SLAG(mass,i)==0)
{
res=0;
ERRORM(8,mass,i);
}
i=i+2;
}
if((mass[i]==14||mass[i]==15)&
{
if(MNOG(mass,i-2)==0)
{
res=0;
ERRORM(9,mass,i-1);
}
else{
if(MNOG(mass,i+1)==0)
{
res=0;
ERRORM(9,mass,i+2);
}}
i=i+2;
}
if(mass[i-1]!=17&&(mass[i-1]!=
res=0;
ERRORM(21,mass,i);
}
}
return res;
}
int YSLOVIE(int mass[], int i)
{
int res=0;
if(mass[i]==5&&mass[i-1]!=20&&
{
i++;
if((mass[i]!=21||mass[i]!=22)&
{
res=0;
ERRORM(10,mass,i);
}
else
{
i=i+6;
if(YSLOVIE(mass,i)==0&&PRISV(
{ res=0;
ERRORM(13,mass,i);}
else
{
if(mass[i]==3)
{
do{i++;}while(!(mass[i]==4&&
if(mass[i+1]!=17&&mass[i+1]!=
ERRORM(21,mass,i);}
i=i+2;
if(mass[i]==7)
if(YSLOVIE(mass,i)==0&&PRISV(
{ res=0;
ERRORM(13,mass,i);}
}
}
// else {while(mass[i]!=17||mass[i]!=
}
}
return res;
}
int PRISV(int mass[], int i)
{
int res=0;
if(MNOG(mass,i)==1&&mass[i+2]=
{
i=i+3;
if(ARV(mass,i)==1)
res=1;
else
{
res=0;
ERRORM(15,mass,i);
}
}
else
{
if(MNOG(mass,i)==1&&MNOG(mass,
{
res=0;
ERRORM(20,mass,i);
}
if(mass[i+2]==19)
{
res=0;
ERRORM(17,mass,i);
}
}
return res;
}
int VVOD(int mass[], int i)
{
int res=0;
if(mass[i]==26 &&mass[i-1]!=
{ i++;
if(mass[i]==10)
{
res=1;
do
{
i++;
if(MNOG(mass,i)==0||mass[i+2]=
{
res=0;
ERRORM(18,mass,i);
}
else
i=i+2;
}while(mass[i]==16);
if(mass[i]!=11){
res=0;
ERRORM(19,mass,i);
}
if(mass[i+1]!=17&&mass[i+1]!=
res=0;
ERRORM(21,mass,i+1);
}
}
else {res=0; ERRORM(19,mass,i-1);}
}
return res;
}
int VIVOD(int mass[], int i)
{
int res=0;
if(mass[i]==25 &&mass[i-1]!=
{
if(mass[i+1]==10)
{
i=i+2;
res=1;
do
{
if(MNOG(mass,i)==0)
{
res=0;
ERRORM(18,mass,i);
}
i=i+3;
}while(mass[i-1]==16);
if(mass[i-1]!=11){
res=0;
ERRORM(19,mass,i);
}
if(mass[i]!=17&&mass[i]!=4){
res=0;
ERRORM(21,mass,i+1);
}
}
else {res=0; ERRORM(19,mass,i-1);}
}
return res;
}
int OPERATOR(int mass[], int i)
{
int res=0;
if(DECLAR(mass,i)==1) res=1;
if(YSLOVIE(mass,i)==1) res=2;
if(PRISV(mass,i)==1) res=3;
if(VVOD(mass,i)==1) res=5;
if(VIVOD(mass,i)==1) res=6;
if(mass[i]==4&&mass[i+1]==24) res=4;
return res;
}
void ANALIS(void)
{
FILE *lexem;
char s[80];
if((lexem=fopen("lexem.txt","
int z=0;
int analiz;
char str[80];
int mass[MAXL];
int endflag=-1;
for(int i=0;i<MAXL;i++) mass[i]=0;
while(!feof(lexem)) fscanf(lexem,"%d",&mass[z++]);
for(int i=0;i<z-1;i++)
{
analiz=OPERATOR(mass,i);
if(analiz==4) endflag=1;
}
if(endflag<0) ERRORM(27,mass,z-2);
BEGINEND(mass);
sprintf( s, "Количество ошибок: %d\n",errornumber);
fclose(lexem);
}
void GENERATOR(void)
{
FILE *lexem,*code;
char s[80];
if((lexem=fopen("lexem.txt","
if((code=fopen("code.txt","w")
int z=0;
char str[80];
int check_do_end=0;
int mass[MAXL];
for(int i=0;i<MAXL;i++) mass[i]=0;
while(!feof(lexem)) fscanf(lexem,"%d",&mass[z++]);
for(int i=0;i<z-1;i++)
{
if(i==0&&mass[0]==1)
{
fprintf(code,"main ");
fprintf(code,"%s;",ID[0].name)
}
if(mass[i]==2 &&mass[i-1]!=20&
{ i=i+2;
while(!(mass[i]==3&&mass[i-1]!
{
if(strcmp(ID[mass[i]].type,"
{
fprintf(code,"\ndcl (%s", ID[mass[i]].name);
i++;
while(mass[i]!=18)
{
i=i+2;
fprintf(code,", %s", ID[mass[i]].name);
i++;
}
i=i+4; if(mass[i]==21) i++;
}
if(strcmp(ID[mass[i]].type,"
{
fprintf(code,"\ndcl (%s", ID[mass[i]].name);
i++;
while(mass[i]!=18)
{
i=i+2;
fprintf(code,", %s", ID[mass[i]].name);
i++;
}
i=i+4; if(mass[i]==21) i++;
}
}
}
if(mass[i]==3 &&mass[i-1]!=
{
// if(mass[i-1]==17) fprintf(code,"\n");
fprintf(code,"\ndo;");
}
if(mass[i]==4&&mass[i-1]!=20&&
{
fprintf(code,"\nend;");
}
if(mass[i]==7&&mass[i-1]!=20&
{
fprintf(code,"\n else ");
}
if(mass[i]==5&&mass[i-1]!=20&&
{
fprintf(code,"\nif %s ", ID[mass[i+2]].name);
if(mass[i+3]==8) fprintf(code,"<");
if(mass[i+3]==9) fprintf(code,">");
if(mass[i+4]==21) fprintf(code,"%s",ID[mass[i+5]
if(mass[i+4]==22) fprintf(code,"%s",CNST[mass[i+
fprintf(code," then ");
}
/*if(mass[i]==7&&mass[i-1]!=
{
fprintf(code,"\nend");
}*/
if(mass[i]==10 &&mass[i-1]!=
{
fprintf(code,"(");
}
if(mass[i]==11 &&mass[i-1]!=
{
fprintf(code,")");
}
if(mass[i]==12 &&mass[i+1]!=
{
if(mass[i-3]>16||mass[i-3]<12)
if(mass[i-2]==21) fprintf(code,"%s",ID[mass[i-1]
if(mass[i-2]==22) fprintf(code,"%s",CNST[mass[i-
}
fprintf(code,"*");
if(mass[i+1]==21) fprintf(code,"%s",ID[mass[i+2]
if(mass[i+1]==22) fprintf(code,"%s",CNST[mass[i+
if(mass[i+3]==4) fprintf(code,";");
}
if(mass[i]==13 &&mass[i-1]!=
{
if(mass[i-3]>16||mass[i-3]<12)
if(mass[i-2]==21) fprintf(code,"%s",ID[mass[i-1]
if(mass[i-2]==22) fprintf(code,"%s",CNST[mass[i-
}
fprintf(code,"/");
if(mass[i+1]==21) fprintf(code,"%s",ID[mass[i+2]
if(mass[i+1]==22) fprintf(code,"%s",CNST[mass[i+
if(mass[i+3]==4) fprintf(code,";");
}
if(mass[i]==14 &&mass[i-1]!=
{
if(mass[i-3]>16||mass[i-3]<12)
if(mass[i-2]==21) fprintf(code,"%s",ID[mass[i-1]
if(mass[i-2]==22) fprintf(code,"%s",CNST[mass[i-
}
fprintf(code,"+");
if(mass[i+1]==21) fprintf(code,"%s",ID[mass[i+2]
if(mass[i+1]==22) fprintf(code,"%s",CNST[mass[i+
if(mass[i+3]==4) fprintf(code,";");
}
if(mass[i]==15 &&mass[i-1]!=
{
if(mass[i-3]>16||mass[i-3]<12)
if(mass[i-2]==21) fprintf(code,"%s",ID[mass[i-1]
if(mass[i-2]==22) fprintf(code,"%s",CNST[mass[i-
}
fprintf(code,"-");
if(mass[i+1]==21) fprintf(code,"%s",ID[mass[i+2]
if(mass[i+1]==22) fprintf(code,"%s",CNST[mass[i+
if(mass[i+3]==4) fprintf(code,";");
}
if(mass[i]==19 &&mass[i-1]!=
{
fprintf(code,"\n%s",ID[mass[i-
fprintf(code,"=");
// if(mass[i+3]==17){
if(mass[i+1]==21) fprintf(code,"%s",ID[mass[i+2]
if(mass[i+1]==22) fprintf(code,"%s",CNST[mass[i+
if(mass[i+3]==4||mass[i+3]==
fprintf(code,";");
// }
}
if(mass[i]==25 &&mass[i-1]!=
{
fprintf(code,"\nputlist(%s",
while(mass[i]==16){
fprintf(code,",%s",ID[mass[i+
}
fprintf(code,");");
// i++;
}
if(mass[i]==26 &&mass[i-1]!=
{
fprintf(code,"\ngetlist(%s",
while(mass[i]==16){
fprintf(code,",%s",ID[mass[i+
}
fprintf(code,");");
//i++;
}
}
fclose(lexem);
fclose(code);
if((code=fopen("code.txt","r")
char buf[80];
while(!feof(code))
{
fgets(buf,79,code);
Form1->Memo2->Lines->Add(buf);
}
fclose(code);
}
void allnull()
{
idsw=0;
cnstsw=0;
for(int i=0;i<MAX;i++)
{
ID[i].nomer=0;
strcpy(ID[i].name,"");
strcpy(ID[i].type,"");
CNST[i].nomer=0;
strcpy(CNST[i].name,"");
strcpy(CNST[i].type,"");
Информация о работе Разработка трехпроходного транслятора с исходного языка на язык ПЛ-1