Разработка трехпроходного транслятора с исходного языка на язык ПЛ-1

Автор: Пользователь скрыл имя, 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

Работа содержит 1 файл

!!!Отчёт_курсовик.docx

— 114.26 Кб (Скачать)

case 4: {if(errmass[err]!=i){sprintf( s, "[Лексема %d]Обнаружена неизвестная константа %s\n",i,CNST[mass[i]].name);errornumber++;break;}}

case 5: {if(errmass[err]!=i){sprintf( s, "[Лексема %d]Отсутствует первый множитель \n",i,ID[mass[i+3]].name);errornumber++;break;}}

case 6: {if(errmass[err]!=i){sprintf( s, "[Лексема %d]Отсутствует  множитель \n",i+2,ID[mass[i]].name);errornumber++;break;}}

case 7: {if(errmass[err]!=i){sprintf( s, "[Лексема %d]Отсутствует множитель \n",i+2,ID[mass[i]].name);errornumber++;break;}}

case 8: {if(errmass[err]!=i){sprintf( s, "[Лексема %d]Отсутствует слагаемое\n",i);errornumber++;break;}}

case 9: {if(errmass[err]!=i){sprintf( s, "[Лексема  %d]Отсутствует первое слагаемое  в (??? {+,-} %s)\n",i,ID[mass[i+3]].name);errornumber++;break;}}

case 10: {if(errmass[err]!=i){sprintf( s, "[Лексема %d]Неправильно оформленo условие\n",i);errornumber++;break;}}

case 11: {if(errmass[err]!=i){sprintf( s, "[Лексема %d]Отсутствует вторая часть неравенства или закрывающая скобка\n",i);errornumber++;break;}}

case 12: {if(errmass[err]!=i){sprintf( s, "[Лексема %d]Отсутствует первая часть неравенства или открывающая скобка\n",i);errornumber++;break;}}

case 13: {if(errmass[err]!=i){sprintf( s, "[Лексема %d]Отсутствует оператор после условия\n",i);errornumber++;break;}}

case 14: {if(errmass[err]!=i){sprintf( s, "[Лексема %d]Некоректно задано условие\n",i);errornumber++;break;}}

case 15: {if(errmass[err]!=i){sprintf( s, "[Лексема %d]Некоректное арифметическое выражение (%s= ???)\n",i,ID[mass[i-2]].name);errornumber++;break;}}

case 16: {if(errmass[err]!=i){sprintf( s, "[Лексема %d]Некорректные атрибуты операции вывода (writeln, ???)\n",i);errornumber++;break;}}

case 17: {if(errmass[err]!=i){sprintf( s, "[Лексема %d]Отсутствует выражение слева от оператора присваивания\n",i);errornumber++;break;}}

case 18: {if(errmass[err]!=i){sprintf( s, "[Лексема %d]Некорректные атрибуты операции ввода(read, ???)\n",i);errornumber++;break;}}

case 19: {if(errmass[err]!=i){sprintf( s, "[Лексема %d]Некорректно записан оператор ввода-вывода\n",i);errornumber++;break;}}

case 20: {if(errmass[err]!=i){sprintf( s, "[Лексема %d]Недопустимое арифметическое действие\n",i);errornumber++;break;}}

case 21: {if(errmass[err]!=i){sprintf( s, "[Лексема %d]Отсутствует ; или :\n",i);errornumber++;break;}}

case 22: {if(i==0){sprintf( s, "[Лексема %d]Ошибка в имени программы\n",i);errornumber++;break;} }

case 23: {if(errmass[err]!=i){sprintf( s, "[Лексема %d]Отсутствует begin\n",i);errornumber++;break;}}

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++;break;}}

}

       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]!=0)

{

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&&mass[i-1]!=21&&mass[i-1]!=22)

{

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,ID[j].name)==0)

{

res=0;

int k;

for(k=0;k<MAXL;k++) if((mass[k]==ID[j].nomer)&&mass[k-1]==21) break;

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&&mass[i-1]!=21&&mass[i-1]!=22)

{

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&&mass[i-1]!=21&&mass[i-1]!=22)

{

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&&mass[i-1]!=21&&mass[i-1]!=22)

{

if(strcmp(ID[mass[i+1]].type,"unknown")==0)

{

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]!=0&&mass[i+2]!=0)

{

if(mass[i]==3&&mass[i-1]!=21&&mass[i-1]!=20&&mass[i-1]!=22) nbegin++;

if(mass[i]==4&&mass[i-1]!=21&&mass[i-1]!=20&&mass[i-1]!=22) nend++;

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]==21||mass[i+2]==22)&&mass[i-1]!=21&&mass[i-1]!=20&&mass[i-1]!=22)

{

res=0;

ERRORM(6,mass,i);

}

if(mass[i]==22&&(mass[i+2]==21||mass[i+2]==22)&&mass[i-1]!=21&&mass[i-1]!=20&&mass[i-1]!=22)

{

res=0;

ERRORM(7,mass,i);

}

if(MNOG(mass,i)==1)

{

res=1;

i=i+2;

while((mass[i]==12||mass[i]==13)&&res==1)

{

i++;

if((mass[i-1]==13)&&(!strcmp(CNST[mass[i+1]].name,"0"))) {res=0;ERRORM(20,mass,i);}

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)&&mass[i-1]!=20&&mass[i-1]!=21&&mass[i-1]!=22)

{

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&&mass[i]-1!=20&&mass[i]-1!=21)

i++;

 

if(SLAG(mass,i)==1)

{

i=i+3;

res=1;

while(SLAG(mass,i)==1&&mass[i-1]!=5&&mass[i-1]!=17){i=i+3;}

if(mass[i]==11&&mass[i]-1!=22&&mass[i]-1!=20&&mass[i]-1!=21)

i++;

while((mass[i]==14||mass[i]==15)&&(res==1))

{

i++;

if(SLAG(mass,i)==0)

{

res=0;

ERRORM(8,mass,i);

}

i=i+2;

}

 

if((mass[i]==14||mass[i]==15)&&mass[i-1]!=20&&mass[i-1]!=21&&mass[i-1]!=22)

{

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]!=4)){

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&&mass[i-1]!=21&&mass[i-1]!=22)

{

i++;

if((mass[i]!=21||mass[i]!=22)&&(mass[i+2]!=8||mass[i+2]!=9)&&(mass[i+3]!=21||mass[i+3]!=22)&&mass[i+5]!=6)

{

                res=0;

ERRORM(10,mass,i);

}

else

{

i=i+6;

if(YSLOVIE(mass,i)==0&&PRISV(mass,i)==0&&VVOD(mass,i)==0&&VIVOD(mass,i)==0&&mass[i]!=3)

{ res=0;

ERRORM(13,mass,i);}

                        else

                        {

                         if(mass[i]==3)

                         {

                         do{i++;}while(!(mass[i]==4&&mass[i-1]!=20&&mass[i-1]!=21&&mass[i-1]!=22));

                         if(mass[i+1]!=17&&mass[i+1]!=7)  { res=0;

                          ERRORM(21,mass,i);}

 

                        i=i+2;

                        if(mass[i]==7)

                                {

                          if(YSLOVIE(mass,i)==0&&PRISV(mass,i)==0&&VVOD(mass,i)==0&&VIVOD(mass,i)==0&&mass[i]!=3)

                { res=0;

                 ERRORM(13,mass,i);}

                                 }

                         }

                        }

  // else {while(mass[i]!=17||mass[i]!=4) i++;enddo=i;}

}

 

}

return res;

 

}

 

int PRISV(int mass[], int i)

{

int res=0;

if(MNOG(mass,i)==1&&mass[i+2]==19)

{

 

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,i+2)==1)

{

 

 

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]!=20&&mass[i-1]!=21&&mass[i-1]!=22)

{        i++;

if(mass[i]==10)

{

 

res=1;

do

{

i++;

 

if(MNOG(mass,i)==0||mass[i+2]==19)

{

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]!=4){

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]!=20&&mass[i-1]!=21&&mass[i-1]!=22)

{

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","r"))==NULL) sprintf( s, "ERROR, can`t open file with lexem");

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","r"))==NULL) sprintf( s, "ERROR, can`t open file with lexem");

if((code=fopen("code.txt","w"))==NULL) sprintf( s, "ERROR, can`t open file for write result code");

 

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&&mass[i-1]!=21&&mass[i-1]!=22)

{         i=i+2;

while(!(mass[i]==3&&mass[i-1]!=20&&mass[i-1]!=21&&mass[i-1]!=22))

{

 

if(strcmp(ID[mass[i]].type,"integer")==0)

{

fprintf(code,"\ndcl (%s", ID[mass[i]].name);

i++;

while(mass[i]!=18)

{

i=i+2;

fprintf(code,", %s", ID[mass[i]].name);

i++;

}

                                fprintf(code,")dec fixed;");

i=i+4; if(mass[i]==21) i++;

}

if(strcmp(ID[mass[i]].type,"real")==0)

{

fprintf(code,"\ndcl (%s", ID[mass[i]].name);

i++;

while(mass[i]!=18)

{

i=i+2;

fprintf(code,", %s", ID[mass[i]].name);

i++;

}

                                  fprintf(code,")dec float;");

i=i+4; if(mass[i]==21) i++;

}

}

 

}

         if(mass[i]==3 &&mass[i-1]!=20&&mass[i-1]!=21&&mass[i-1]!=22)

 

{

                 //  if(mass[i-1]==17)  fprintf(code,"\n");

         fprintf(code,"\ndo;");

        }

 

if(mass[i]==4&&mass[i-1]!=20&&mass[i-1]!=21&&mass[i-1]!=22)

{

fprintf(code,"\nend;");

}

         if(mass[i]==7&&mass[i-1]!=20&&mass[i-1]!=21&&mass[i-1]!=22)

{

fprintf(code,"\n else ");

}

if(mass[i]==5&&mass[i-1]!=20&&mass[i-1]!=21&&mass[i-1]!=22)

{

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]].name);

if(mass[i+4]==22) fprintf(code,"%s",CNST[mass[i+5]].name);

                 fprintf(code," then ");

}

/*if(mass[i]==7&&mass[i-1]!=20&&mass[i-1]!=21&&mass[i-1]!=22)

{

fprintf(code,"\nend");

}*/

if(mass[i]==10 &&mass[i-1]!=20&&mass[i-1]!=21&&mass[i-1]!=22)

{

fprintf(code,"(");

}

 

if(mass[i]==11 &&mass[i-1]!=20&&mass[i-1]!=21&&mass[i-1]!=22)

{

fprintf(code,")");

}

 

 

if(mass[i]==12 &&mass[i+1]!=13&&mass[i-1]!=20&&mass[i-1]!=21&&mass[i-1]!=22)

{

if(mass[i-3]>16||mass[i-3]<12){

if(mass[i-2]==21) fprintf(code,"%s",ID[mass[i-1]].name);

if(mass[i-2]==22) fprintf(code,"%s",CNST[mass[i-1]].name);

}

fprintf(code,"*");

if(mass[i+1]==21) fprintf(code,"%s",ID[mass[i+2]].name);

if(mass[i+1]==22) fprintf(code,"%s",CNST[mass[i+2]].name);

                if(mass[i+3]==4)  fprintf(code,";");

 

}

if(mass[i]==13 &&mass[i-1]!=20&&mass[i-1]!=21&&mass[i-1]!=22)

{

if(mass[i-3]>16||mass[i-3]<12){

if(mass[i-2]==21) fprintf(code,"%s",ID[mass[i-1]].name);

if(mass[i-2]==22) fprintf(code,"%s",CNST[mass[i-1]].name);

}

fprintf(code,"/");

if(mass[i+1]==21) fprintf(code,"%s",ID[mass[i+2]].name);

if(mass[i+1]==22) fprintf(code,"%s",CNST[mass[i+2]].name);

                if(mass[i+3]==4)  fprintf(code,";");

}

if(mass[i]==14 &&mass[i-1]!=20&&mass[i-1]!=21&&mass[i-1]!=22)

{

if(mass[i-3]>16||mass[i-3]<12){

if(mass[i-2]==21) fprintf(code,"%s",ID[mass[i-1]].name);

if(mass[i-2]==22) fprintf(code,"%s",CNST[mass[i-1]].name);

}

fprintf(code,"+");

if(mass[i+1]==21) fprintf(code,"%s",ID[mass[i+2]].name);

if(mass[i+1]==22) fprintf(code,"%s",CNST[mass[i+2]].name);

                if(mass[i+3]==4)  fprintf(code,";");

}

if(mass[i]==15 &&mass[i-1]!=20&&mass[i-1]!=21&&mass[i-1]!=22)

{

if(mass[i-3]>16||mass[i-3]<12){

if(mass[i-2]==21) fprintf(code,"%s",ID[mass[i-1]].name);

if(mass[i-2]==22) fprintf(code,"%s",CNST[mass[i-1]].name);

}

fprintf(code,"-");

if(mass[i+1]==21) fprintf(code,"%s",ID[mass[i+2]].name);

if(mass[i+1]==22) fprintf(code,"%s",CNST[mass[i+2]].name);

                if(mass[i+3]==4)  fprintf(code,";");

}

if(mass[i]==19 &&mass[i-1]!=20&&mass[i-1]!=21&&mass[i-1]!=22)

{

fprintf(code,"\n%s",ID[mass[i-1]].name);

fprintf(code,"=");

       // if(mass[i+3]==17){

if(mass[i+1]==21) fprintf(code,"%s",ID[mass[i+2]].name);

if(mass[i+1]==22) fprintf(code,"%s",CNST[mass[i+2]].name);

               if(mass[i+3]==4||mass[i+3]==17)

                fprintf(code,";");

      // }

}

 

if(mass[i]==25 &&mass[i-1]!=20&&mass[i-1]!=21&&mass[i-1]!=22)

{

fprintf(code,"\nputlist(%s",ID[mass[i+3]].name);   i=i+4;

        while(mass[i]==16){

fprintf(code,",%s",ID[mass[i+2]].name); i=i+3;

}

 

                 fprintf(code,");");

      // i++;

}

if(mass[i]==26 &&mass[i-1]!=20&&mass[i-1]!=21&&mass[i-1]!=22)

{

fprintf(code,"\ngetlist(%s",ID[mass[i+3]].name);   i=i+4;

        while(mass[i]==16){

fprintf(code,",%s",ID[mass[i+2]].name); i=i+3;

}

 

                 fprintf(code,");");

//i++;

}

}

 

fclose(lexem);

fclose(code);

if((code=fopen("code.txt","r"))==NULL) sprintf( s, "ERROR, can`t open file for write result code");

    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